【问题标题】:Junit test becomes broken when I change a way to initialize Mockito当我改变初始化 Mockito 的方式时,Junit 测试被破坏
【发布时间】:2020-05-31 22:10:21
【问题描述】:
public class DummyTest {

    @InjectMocks
    private TestService service;
    @Mock
    private TestRepository repository;

    @BeforeEach
    public void before() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testMe() {
        when(repository.findAllByQuery("")).thenReturn(List.of());
        List<String> entities = service.findAllByQuery("test");

        verify(repository, times(1)).findAllByQuery(anyString());
    }
}

class TestService {

    private TestRepository repository;

    public List<String> findAllByQuery(String query) {
        return repository.findAllByQuery(query);
    }
}

class TestRepository {

    public List<String> findAllByQuery(String query) {
        return List.of("");
    }
}

当我通过@BeforeEach 注解进行Mockito 初始化时,上述测试成功通过。 之后,我尝试删除@BeforeEach 注释并使用@ExtendWith(MockitoExtension.class) 初始化Mockito 并且测试失败,原因是:

org.mockito.exceptions.misusing.UnnecessaryStubbingException:

org.mockito.exceptions.misusing.UnnecessaryStubbingException: 
Unnecessary stubbings detected.
Clean & maintainable test code requires zero unnecessary code.
Following stubbings are unnecessary (click to navigate to relevant line of code):
  1. -> at DummyTest.testMe(DummyTest.java:33)
Please remove unnecessary stubbings or use 'lenient' strictness. More info: javadoc for UnnecessaryStubbingException class.

能否请您解释一下,为什么我得到如此不同的测试执行结果?从技术上讲,我刚刚改变了初始化 Mockito 的方式等等。

【问题讨论】:

    标签: unit-testing testing junit mockito junit5


    【解决方案1】:

    @ExtendWith(MockitoExtension.class)MockitoAnnotations.initMocks(this) 以稍微不同的方式配置 Mockito。

    当你使用@ExtendWith(MockitoExtension.class) 时,额外配置了Mockito 的“严格性”,默认值为STRICT_STUBS

    这意味着您必须像这样更改存根的配置:

        @Test
        public void testMe() {
            when(repository.findAllByQuery(anyString())).thenReturn(List.of());
            List<String> entities = service.findAllByQuery("test");
    
            verify(repository, times(1)).findAllByQuery(anyString());
        }
    

    甚至像这样:

        @Test
        public void testMe() {
            when(repository.findAllByQuery(eq("test"))).thenReturn(List.of());
            List<String> entities = service.findAllByQuery("test");
    
            verify(repository, times(1)).findAllByQuery(anyString());
        }
    

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 2019-11-08
      • 1970-01-01
      相关资源
      最近更新 更多