2017-10-20 9 views
2

を確認します。春ブーツとMockitoは私が方法が与えられたパラメータで呼び出されたことを確認したいテストを持って常に真

@Autowired 
    private Client client; 

    @Autowired 
    private OtherClient otherClient; 

    @Test 
    public void test() { 
     client.push(); 

     Mockito.verify(otherClient).publishReset(
      Mockito.anyString(), 
      Mockito.argThat(l -> l.size() == 3) 
     ); 
    } 

問題はMockito.verifyが全く失敗しないということですが、私は置き換えることができますl -> l.size() == 3と他のサイズの一致およびテストは常に合格となります。どのように私がargThatに渡すものであれ、常に検証がどのように合格することが可能ですか?

以下

全例:

@EnableConfigurationProperties 
@TestExecutionListeners(listeners = { 
    DirtiesContextTestExecutionListener.class, 
    DirtiesContextBeforeModesTestExecutionListener.class, 
    ServletTestExecutionListener.class, 
    DependencyInjectionTestExecutionListener.class, 
    MockitoTestExecutionListener.class, 
    TransactionalTestExecutionListener.class, 
    WithSecurityContextTestExecutionListener.class 
}) 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) 
@EnableAspectJAutoProxy(proxyTargetClass = true) 
@ContextConfiguration(
    loader = SpringBootContextLoader.class, 
    classes = {MyApp.class, IntegrationTestContext.class}) 
@RunWith(SpringRunner.class) 
public class FooIT { 
    @Autowired 
    private Client client; 

    @Autowired 
    private OtherClient otherClient; 

    @Test 
    public void test() { 
     client.push(); 

     Mockito.verify(otherClient).publishReset(
      Mockito.anyString(), 
      Mockito.argThat(l -> l.size() == 3) 
     ); 
    } 
} 

と構成クラス:

@Configuration 
@MockBeans({ 
    @MockBean(OtherClient.class), 
}) 
public class IntegrationTestContext { 
} 

は私が間違ってやっている何かがありますか?どういうわけか、Springがmockitoに干渉していますか?

答えて

0

ガベージコレクタに問題がありました。私は大きなサイズのリストlを作成しました。サイズを小さくすると、多くのオブジェクト(> 30k、多くのフィールド)をコンテナに入れました。 100すべてが正しく動作するようになりました。

基本的には、あまりにも多くのメモリを取るオブジェクト(おそらく何らかの種類の弱い参照が使用されています)を使ってmockitoを動作させないでください。リストのサイズを小さくする。

1

Mockitoは、Springプロキシと最終的なクラス/メソッドの監視に問題があります。いくつかのケースでは、これが役立つことがあります。これは、同様の問題で私を助けているとのGithub上でこのMockito-issueに触発された

Mockito.mock(SomeMockableType.class,AdditionalAnswers.delegatesTo(someInstanceThatIsNotMockableOrSpyable)); 

    // 
    // In your case: 
    @Test 
    public void test() {   
     OtherClient yourSpy = Mockito.mock(OtherClient.class,  
     AdditionalAnswers.delegatesTo(otherClient)); 

     client.push(); 

     Mockito.verify(yourSpy).publishReset(
     Mockito.anyString(), 
     Mockito.argThat(l -> l.size() == 3) 
     ); 
    } 

関連する問題