春豆再定義では単体テスト環境
-
05-09-2019 - |
質問
また利用の春のためのアダプタのご使用を目的に、テスティングフレームワークのためのユニット。しているもの:のアプリケーションコードを読み込む春のアプリケーションのコンテキストのリストから所(xmlファイルを、classpath.が弊社のユニットテストまたは一部の春の豆を疑似ではなく本格的な実施。また、一部のユニットテストしてみたい豆な疑似しかしながら、他のユニットテストしたいその他の豆となる疑似としての試験の異なる層のものに限ります。
すべてこの思いを再定義する特定の豆のアプリケーションのコンテキストおよびリフレッシュのが望ましい。このようたいを再定義のみの小さな部分の豆に位置しつオリジナルのxml豆の定義ファイルです。がいないので簡単について教えてください。いつでもとることである単体テストの優しい仕組みが必要とな情報を見落とさないようです。
しいアイデアをどうするの?
感謝。
解決
私は春のbean.xmlの場所のカスタムTestClassをし、いくつかの簡単なルールを提案する
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"classpath*:spring/*.xml",
"classpath*:spring/persistence/*.xml",
"classpath*:spring/mock/*.xml"})
@Transactional
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
TransactionalTestExecutionListener.class,
DirtiesContextTestExecutionListener.class})
public abstract class AbstractHibernateTests implements ApplicationContextAware
{
/**
* Logger for Subclasses.
*/
protected final Logger LOG = LoggerFactory.getLogger(getClass());
/**
* The {@link ApplicationContext} that was injected into this test instance
* via {@link #setApplicationContext(ApplicationContext)}.
*/
protected ApplicationContext applicationContext;
/**
* Set the {@link ApplicationContext} to be used by this test instance,
* provided via {@link ApplicationContextAware} semantics.
*/
@Override
public final void setApplicationContext(
final ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
}
モックbean.xmlが指定した場所に存在する場合、彼らは「通常」の位置にあるすべての「本当の」bean.xmlを上書きします - あなたの通常の場所が異なる場合があります。
しかし...私はそれは、アプリケーションが古い成長したときに、問題を追跡するのは難しいモックと非モック豆を混ぜることはない。
他のヒント
理由の一つは、春はどの試験に優しいはるかもしれないので、そのやすだけで 新しい または模擬するのは、ユニットテストです。
交互に使用しております以下のセットアップは成功裏のようなものだったのでしょうが近くになりたいのか、 強く 推薦しています:
すべての豆を必要とする異なる実装の異なるコンテキストスイッチンに基づく配線を行ってください。できる場合もありますが、その他いたします。
実施し、以下のセットアノテーション
<context:component-scan base-package="com.foobar">
<context:include-filter type="annotation" expression="com.foobar.annotations.StubRepository"/>
<context:include-filter type="annotation" expression="com.foobar.annotations.TestScopedComponent"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
その注釈を付けお ライブ の実装を@にリポジトリ、 スタブ の実装を@にStubRepository、コードする存在のユニットテスト治具のみを@にTestScopedComponent.合の必要なカップルに注釈がこれらの大きます。
また多くのspring.xmlまもう少し新しい春のxmlファイルは基本的に初回生産のみを含むコンポーネント-スキャンの定義。まんを追加これらのファイルを正@ContextConfiguration一覧です。デジタル化できなかった理由はいくと異なる形状のコンテキストをスキャン(信託できているかの確認を行います。 ま く少なくとも1の注釈がやっているウェブ試験、関連する4組み合わせ)
その基本的使用の
@ContextConfiguration(locations = { "classpath:/path/to/root-config.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
なお、この設定は ない を使って交互に組み合わせのスタブ/ライブデータです。したことではないかと思うの結果、ごちゃごちゃんとてもおもしのいずれかの線インのフルセットのスタブの設定のサービス
また、当社で最も多いオートスタブ有線依存関係のテスト時にguiの近くのものが、依存関係は通常、非常に充実しています。クリーンをコードしていただきありがとうござい通常のユニットテスト。
当社のシステムとして、以下のxmlファイルのためのコンポーネント-スキャン
- 通常のweb制作
- 開始時のウェブスタブのみ
- 統合テストを行程度php,c#,d)
- ユニットテストを行程度php,c#,d)
- セレンwebテストを行程度php,c#,d)
することこそ、重要であり、これって、5つの異なるシステム全体の構成できるアプリケーションを開始します。しての使用は注釈、春にあるのは、autowireものユニットテストしたい配線。ごきげんよう、トメ子ですuntraditionalで本当に素晴らしいです。
ウ統合テストランのフルライブセットアップ、および回っていた 本当に 実現を目指し、実践したい5つのライブ配線の単一のモック:
public class HybridTest {
@Autowired
MyTestSubject myTestSubject;
@Test
public void testWith5LiveServicesAndOneMock(){
MyServiceLive service = myTestSubject.getMyService();
try {
MyService mock = EasyMock.create(...)
myTestSubject.setMyService( mock);
.. do funky test with lots of live but one mock object
} finally {
myTestSubject.setMyService( service);
}
}
}
ピックアップしました。試験純粋主義者にすべてのってくれています。もうので、非常に実践的な解決が非常に優雅な時に代替するか醜い.もので、通常そのguiの近くです。
@InjectedMockアノテーションでこのチュートリアルを参照してください>
それは私に多くの時間を保存しました。あなただけの使用
@Mock
SomeClass mockedSomeClass
@InjectMock
ClassUsingSomeClass service
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
と、すべての問題が解決されます。 Mockitoモックで春の依存性注入を交換します。私はちょうどそれを自分自身を使用し、それは素晴らしい作品ます。
ここに記載されているいくつかの非常に複雑で強力なソリューションがあります。
しかし、STAがテストメソッド内のコードの1行以外の変更伴わない、求めているものを達成するための FAR、はるかに簡単の方法があります。それはautowired依存関係、プライベートと保護フィールドのために、同様のユニットテストとSpring統合テストのために働くます。
ここでは、次のとおりです。
junitx.util.PrivateAccessor.setField(testSubject, "fieldName", mockObject);
また、すべての任意の検索を必要としないように、あなたのユニットテストを書くことができます:
@ContextConfiguration(locations = { "classpath:/path/to/test-config.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
public class MyBeanTest {
@Autowired
private MyBean myBean; // the component under test
@Test
public void testMyBean() {
...
}
}
これはテスト用の設定ファイルで、実際の設定ファイルをミックスし、一致する簡単な方法を提供します。
休止状態を使用している場合たとえば、私は(テストやメインアプリの両方で使用される)1つのconfigファイルで私のSessionFactory豆を持っているかもしれないし、別の設定ファイル内のdataSource Beanによって持って(一つはへDriverManagerDataSourceを使用する場合がありますインメモリ・データベース、その他)は、JNDIルックアップを使用する場合があります。
しかし、間違いなく @ cletus年代の注意を払います>警告; - )
簡単。あなたのユニットテスト用のカスタムアプリケーションコンテキストを使用しています。それとも、すべての1つを使用していない、あなたは手動であなたのBeanを作成し、注入します。
あなたのテストは少し広すぎるかもしれませんようにそれは私に聞こえます。ユニットテストは、テスト、よく、単位についてです。 Spring Beanは、ユニットのかなり良い例です。あなたはそのためのアプリケーション全体のコンテキストを必要はありません。私はあなたのユニットテストは、あなたが豆、データベース接続などの数百人が、あなたは非常に次の変化に破るしようとしている本当に壊れやすいユニットテストを持っている必要があるので、ハイレベルであれば、維持するのは難しいだろうことを見つけて、本当に」にISN T値の多くを追加します。
あなたにはインポートの機能を使用することができますPROD豆にロードし、あなたが望むものをオーバーライドするテストアプリケーションのコンテキスト。例えば、私のprodデータソースは、通常、JNDIルックアップを介して取得されていますが、私はDriverManagerのデータソースを使用してテストするときに、私はテストにアプリケーションサーバーを起動する必要はありません。
私はduffymoの答えに山積みし評判ポイントを持っていないが、私はちょうどチャイムと彼は私のために「正しい」答えた言いたかっます。
カスタムapplicationContext.xmlを持つあなたのユニットテストのセットアップでFileSystemXmlApplicationContextをインスタンス化します。 duffymoが示すように、そのカスタムXMLでは、上部に、行います。次に、インポートで宣言されたIDを上書きすること、など、あなたのモック豆、非JNDIデータソースを宣言します。
私にとっては夢のように働いています。
あなたはすべてのテストコンテキストを使用する必要はありません(重要ではありません基づいて、XMLやJavaです)。春は1.4を起動しているので利用できる新しい注釈<のhref = "http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-testing-spring-boot-applications-mockingがあります春豆のモックおよびスパイのネイティブサポートを導入-beans」REL = 『nofollowを』> @MockBean
の
おそらくあなたは、あなたのBeanの修飾子を使用することができますか?あなたが別のアプリケーションコンテキストにモックアップと修飾子「テスト」とラベルを付けたい豆を再定義します。あなたの豆を配線するときは、あなたのユニットテストでは、常にモックアップを使用する修飾子「test」を指定します。
私は同じことをしたい、と我々はそれが不可欠発見しています。
私たちが使用する現在のメカニズムはかなりマニュアルですが、それは動作します。
「IHasY」 -たとえば、あなたは私たちがやることは、我々はインターフェイスを実装作ることの依存関係を持つすべてのBeanですタイプYの豆をモックとしたいと言います。このインタフェースである。
interface IHasY {
public void setY(Y y);
}
その後、我々はutilのメソッドを呼び出す我々のテストで...
public static void insertMock(Y y) {
Map invokers = BeanFactory.getInstance().getFactory("core").getBeansOfType(IHasY.class);
for (Iterator iterator = invokers.values().iterator(); iterator.hasNext();) {
IHasY invoker = (IHasY) iterator.next();
invoker.setY(y);
}
}
私はちょうどこの新しい依存関係を注入するために全体のxmlファイルを作成しないと、私はこれが好きな理由です。
あなたは、XML設定ファイルを作成するために喜んでいる場合は、その後、移動するための方法は、模擬豆新工場を作成し、デフォルトの工場この工場の親を作ることであろう。あなたは新しい子工場からのすべてのあなたの豆をロードすること、次に確認してください。この際、サブ工場は豆のidのが同じである場合、親工場で豆を上書きします。
さてもし、私のテストでは、私はのプログラムでの素晴らしいだろう工場を、作成することができます。 XMLを使用するために持つことは、あまりにも面倒です。私はコードでその子ファクトリを作成していますよ。次に、各テストでは、工場出荷時、それは望んでいる方法を設定することができます。そのような工場が動作しませんない理由はありません。
スプリング再注入するはモックで豆を置換するように設計されている。
OPので、これは一緒に来ました: Springockitoする