VHS*_*VHS 79 java spring mockito
我的代码如下,
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在低于例外
Run Code Online (Sandbox Code Playgroud)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)
请帮我解决一下
小智 101
替换@RunWith(MockitoJUnitRunner.class)为@RunWith(MockitoJUnitRunner.Silent.class).
Dco*_*tez 60
首先,您应该检查您的测试逻辑.通常有3个案例.首先,你是在嘲笑错误的方法(你做了一个拼写错误或有人更改了经过测试的代码,因此不再使用模拟方法).其次,在调用此方法之前,您的测试失败.第三,你的逻辑在代码中的某个地方出现了错误的if/switch分支,因此不会调用mocked方法.
如果这是第一种情况,您总是希望更改代码中使用的方法的模拟方法.它取决于第二和第三.通常你应该删除这个模拟,如果它没用.但有时在参数化测试中存在某些情况,这些情况应该采用这种不同的路径或更早地失败.然后你可以将这个测试分成两个或多个单独的测试,但这并不总是很好看.可能有3个参数提供程序的3个测试方法可以使您的测试看起来不可读.在JUnit 4的情况下,您可以使用其中任何一个来声明此异常
@RunWith(MockitoJUnitRunner.Silent.class)
Run Code Online (Sandbox Code Playgroud)
注释或者您正在使用规则方法
@Rule
public MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.LENIENT);
Run Code Online (Sandbox Code Playgroud)
或(相同的行为)
@Rule
public MockitoRule rule = MockitoJUnit.rule().silent();
Run Code Online (Sandbox Code Playgroud)
对于JUnit 5测试,您可以使用mockito-junit-jupiter包中提供的注释来声明此异常.
@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.LENIENT)
class JUnit5MockitoTest {
}
Run Code Online (Sandbox Code Playgroud)
joh*_*384 22
when(dao.doSearch(dto)).thenReturn(inspectionsSummaryList);//got error in this line
verify(dao).doSearchInspections(dto);
Run Code Online (Sandbox Code Playgroud)
在when这里配置您的模拟做一些事情.但是,你不能在这一行之后以任何方式使用这个模拟(除了做一个verify).Mockito警告你,when因此这条线是毫无意义的.也许你犯了一个逻辑错误?
sgr*_*lon 21
沉默不是解决方案。您需要在测试中修复模拟。请参阅此处的官方文档。
不必要的存根是在测试执行期间从未实现的存根方法调用(另请参见MockitoHint),例如:
//code under test:
...
String result = translator.translate("one")
...
//test:
...
when(translator.translate("one")).thenReturn("jeden"); // <- stubbing realized during code execution
when(translator.translate("two")).thenReturn("dwa"); // <- stubbing never realized
...
Run Code Online (Sandbox Code Playgroud)
注意,在测试执行期间,被测试的代码之一从未在被测试的代码中实现。流氓存根可能是开发人员的疏忽,复制粘贴的人工产物或不了解测试/代码的影响。无论哪种方式,开发人员最终都会得到不必要的测试代码。为了保持代码库的清洁和可维护性,有必要删除不必要的代码。否则,测试将更难以阅读和推理。
要了解有关检测未使用的存根的更多信息,请参见MockitoHint。
phi*_*ous 13
对我而言@Rule,@RunWith(MockitoJUnitRunner.Silent.class)建议和建议都不起作用。这是一个旧项目,我们升级到了模仿核心2.23.0。
我们可以UnnecessaryStubbingException使用以下方法摆脱掉:
Mockito.lenient().when(mockedService.getUserById(any())).thenReturn(new User());
Run Code Online (Sandbox Code Playgroud)
代替:
when(mockedService.getUserById(any())).thenReturn(new User());
Run Code Online (Sandbox Code Playgroud)
不用说,您应该看一下测试代码,但是我们需要先编译东西,然后首先运行测试;)
正如其他人指出的那样,删除不必要地存根方法调用的行通常是最简单的。
就我而言,它位于 a 中@BeforeEach并且大多数时候都是相关的。在唯一未使用该方法的测试中,我重置了模拟,例如:
myMock.reset()
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助其他遇到同样问题的人。
(请注意,如果同一个模拟上有多个模拟调用,这也可能会很不方便,因为您必须模拟除未调用的方法之外的所有其他方法。)
这已经在评论中指出了,但我认为这太容易被忽视了:如果您UnnecessaryStubbingException只是通过将现有的替换为 JUnit 4 测试类来将 JUnit 4 测试类转换为 JUnit 5 测试类@Before,@BeforeEach并且如果您执行一些存根,您可能会遇到在该设置方法中,至少有一个测试用例未实现。
这个 Mockito 线程@Before有更多关于这方面的信息,基本上和之间的测试执行存在细微的差异@BeforeEach。对于,如果任何测试用例实现了存根@Before就足够了,对于,所有用例都必须这样做。@BeforeEach
如果您不想将设置分解@BeforeEach为许多小部分(正如上面引用的评论正确指出的那样),还有另一种选择,而不是激活整个测试类的宽松模式:您只需将这些存根放在该@BeforeEach方法宽松,单独使用lenient()。
小智 5
代替
@RunWith(MockitoJUnitRunner.class)
和
@RunWith(MockitoJUnitRunner.Silent.class)
或删除@RunWith(MockitoJUnitRunner.class)
或者只是注释掉不需要的模拟调用(显示为未经授权的存根)。
| 归档时间: |
|
| 查看次数: |
66084 次 |
| 最近记录: |