当前位置: 首页 > 知识库问答 >
问题:

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

晁砚
2023-03-14

我的代码如下,

@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)

请帮助我如何解决

共有3个答案

曹嘉许
2023-03-14

对我来说,@规则@Runwith(MockitoJUnitRunner.Silent.class)建议都不起作用。这是一个遗留项目,我们在其中升级到mockito-core 2.23.0。

我们可以使用以下方法消除<code>不必要的StubbingException</code>:

Mockito.lenient().when(mockedService.getUserById(any())).thenReturn(new User());

而不是:

when(mockedService.getUserById(any())).thenReturn(new User());

不用说,您更应该查看测试代码,但我们首先需要编译代码并运行测试;)

戚阳
2023-03-14

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

翟迪
2023-03-14

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

如果这是第一种情况,您总是希望将模拟方法更改为代码中使用的方法。第二个和第三个取决于。通常,如果这个mock没有用处,您应该删除它。但有时在参数化测试中会出现某些情况,这些情况应采用不同的路径或更早失败。然后,您可以将此测试分成两个或多个单独的测试,但这并不总是好看的。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 {
}
 类似资料: