如何解决不必要的存根异常

2022-08-31 07:09:30

我的代码如下,

@RunWith(MockitoJUnitRunner.class)
public class MyClass {

    private static final String code ="Test";

    @Mock
     private MyClassDAO dao;

    @InjectMocks
     private MyClassService Service = new MyClassServiceImpl();

    @Test
     public void testDoSearch() throws Exception {
         final String METHOD_NAME = logger.getName().concat(".testDoSearchEcRcfInspections()");
         CriteriaDTO dto = new CriteriaDTO();
         dto.setCode(code);
         inspectionService.searchEcRcfInspections(dto);
         List<SearchCriteriaDTO> summaryList = new ArrayList<SearchCriteriaDTO>();
         inspectionsSummaryList.add(dto);
         when(dao.doSearch(dto)).thenReturn(inspectionsSummaryList);//got error in this line
         verify(dao).doSearchInspections(dto);

      }
}

我得到以下例外

org.mockito.exceptions.misusing.UnnecessaryStubbingException: 
Unnecessary stubbings detected in test class: Test
Clean & maintainable test code requires zero unnecessary code.
Following stubbings are unnecessary (click to navigate to relevant line of code):
  1. -> at service.Test.testDoSearch(Test.java:72)
Please remove unnecessary stubbings or use 'silent' option. More info: javadoc for UnnecessaryStubbingException class.
  at org.mockito.internal.exceptions.Reporter.formatUnncessaryStubbingException(Reporter.java:838)
  at org.mockito.internal.junit.UnnecessaryStubbingsReporter.validateUnusedStubs(UnnecessaryStubbingsReporter.java:34)
  at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:49)
  at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:103)
  at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
  at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

请帮我解决如何


答案 1

首先,您应该检查测试逻辑。通常有3种情况。首先,您正在模拟错误的方法(您犯了拼写错误或有人更改了测试代码,以便不再使用模拟方法)。其次,在调用此方法之前,测试失败。第三,如果/switch分支在代码中的某个地方出错,因此不会调用模拟方法。

如果这是第一种情况,则始终希望更改代码中使用的模拟方法。对于第二个和第三个,它取决于。通常,如果这个模拟没有用,你应该删除它。但有时在参数化测试中存在某些情况,这些情况应该采取这种不同的路径或更早地失败。然后,您可以将此测试拆分为两个或多个单独的测试,但这并不总是好看的。3 种测试方法(可能具有 3 个参数提供程序)可能会使测试看起来不可读。在这种情况下,对于 JUnit 4,您可以使用以下任一条件将此异常静音

@RunWith(MockitoJUnitRunner.Silent.class) 

批注或是否正在使用规则方法

@Rule
public MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.LENIENT);

或(相同的行为)

@Rule
public MockitoRule rule = MockitoJUnit.rule().silent();

对于 JUnit 5 测试,您可以使用软件包中提供的以下注释将此异常静音:mockito-junit-jupiter

@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.LENIENT)
class JUnit5MockitoTest {
}

答案 2

替换为 。@RunWith(MockitoJUnitRunner.class)@RunWith(MockitoJUnitRunner.Silent.class)


推荐