コンポーネントテストと統合テストの両方を備えたアプリケーションに取り組んでいます。その場合の違いは次のとおりです。コンポーネントテストは複数のクラスをテストし(つまり、その内部オブジェクトはすべてモックアウトされているわけではありませんが、一部は[JMSパブリッシャーなど]である可能性があります)、統合テストはすべてがモックアウトされています。つまり、Springはオブジェクトを提供し、そのままテストします。
ここまでは順調ですね。
問題は次のとおりです。Springコンテキストから依存関係を置き換えるために、Springockito(https://bitbucket.org/kubek2k/springockito/wiki/Home)を使用しました。これは、Beanをモックアウトする方法を提供します。 Springのコンテキストから。
だから-コンポーネントテストで-私はこれを持っています:
@RunWith(SpringJUnit4ClassRunner.class)
@DirtiesContext(classMode = AFTER_CLASS)
@ContextConfiguration(loader = SpringockitoContextLoader.class, locations = "classpath:spring-classify-test.xml")
public class....
@Autowired
@ReplaceWithMock
private SomeServiceInterface someServiceInterface;
@Autowired
private Bean bean;
Beanには、依存関係としてSomeServiceInterfaceがあります。
public class Bean {
private SomeServiceInterface...
上記の場合、SomeServiceInterfaceはモックに置き換えられます。もちろん、その例は問題を単純化しすぎています。Beanを、オブジェクトグラフのさらに下にある依存関係であるモックオブジェクトに置き換えます。
次のファイルからコンテキストをロードすることは注目に値します:spring-classify-test.xmlまた、クラスの実行後にコンテキストをダーティとしてマークすることも注目に値します。したがって、次のテストクラスであるAFAIKはコンテキストをリロードする必要があります。
今度は統合テスト:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = SpringockitoContextLoader.class, locations = {"classpath:/spring-service-integration-test.xml" })
public class ...
@Autowired
private Bean bean;
spring-service-integration-test.xmlからコンテキストをロードしますが、Bean内のSomeServiceInterfaceはまだモックされています!統合テストで使用されるコンテキストも変更されました。
統合テストを@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)でマークすると、SomeServiceInterfaceがモックされているため、クラスの最初のテストは失敗しますが、コンテキストが既に更新されているため、次のテストは成功します。
面白いことは:
統合テストでSomeServiceInterfaceを注入するようにSpringに依頼すると、モックではなく、SomeServiceInterfaceの具体的な実装が注入されます。
私はその問題を解決するために多くのことを試みました:
コンテキストからregisterBeanDefinitionメソッドを使用してコンポーネントのテストが実行された後、コンテキスト内のBeanをプログラムでオーバーライドします。
IntegrationTestを実行する前にコンテキストを手動で更新できるように、TestExecutionリスナーを作成します
異なるコンテキストに同じローダーを使用してください。
この話はどんどん続きます。
誰かが何か考えを持っていますか?
PS:Springockitoの採用は疑わしいアイデアだったことはよく理解していますが、その決定は私が行ったものではなく、プロジェクトには500を超えるテストがあります。したがって、Springockitoを削除するためにすべてをリファクタリングするのは大変な作業になるため、実行可能なオプションATM。