在使用mockbean之后无法调用真实方法

时间:2017-10-24 22:10:27

标签: java spring unit-testing mockito spring-test

我是使用Spring启动的mockito中的新手。我的问题是,我使用mockito作为下面的mockito。

   @Autowired
   private AnotherService anotherService;

    @MockBean
    private SchedulerService schedulerService;

    @Test
    public void test() {
        NpMesaj npMesaj = new NpMesaj("npMesaj");
        when(schedulerService.schedule(any(NpMesaj.class))).thenThrow(new RuntimeException("Error"));
        try {
            anotherService.start(npMesaj);
        } catch (Exception e) {
        }
        Optional<NpMesaj> npMesajFromDb = repository.findById(npMesaj.getId());
        assertThat("A_Err", npMesajFromDb.isPresent(), is(false));
    }

SchedulerService用于anotherService.start方法。它在这个测试范围内被嘲笑,我的断言效果很好。 在这个测试之后,我执行下面的另一个单元测试类并且它不起作用。它不包括任何模拟bean或方法。

// Unit Test-2
@Autowired
private DiffService diffService;

@Test
public void test_2(){
    int diff = diffService.startDiffProcess();
    assertThat("A_Err", diff, is(0));
}

此测试方法的startDiffProcess方法调用也调用其中的anotherService.start方法,如下所示:

@Autowired
private AnotherService anotherService;

public int startDiffProcess(){
    anotherService.start();
    return 0;
}

在上面的第一个测试中,我提到了AnotherService使用SchedulerService。当我调试Unit-test-2时,AnotherService中的SchedulerService被视为带有MockInterceptor的mockitoMock,无法执行实际方法。

可能是什么原因?为什么模拟方法调用无法重置? 感谢。

1 个答案:

答案 0 :(得分:0)

这是我自己没有经历的奇怪行为。这些测试类是否在同一个包中?

无论哪种方式,在第一次测试中,您可以将类标记为@DirtiesContext,以确保从上下文缓存中删除该测试中使用的Spring应用程序上下文。这应该可以防止在另一个测试类中加载相同的上下文。