我们要测试的类是:
public class Service{ private Collaborator collaborator; public Service(Collaborator collaborator){ this.collaborator= collaborator; } public String performService(String input){ return collaborator.transformString(input); } }
它的合作者是:
public class Collaborator { public String transformString(String input){ return doStuff(); } private String doStuff() { // 此方法可能充满了错误 . . . return someString; } }
在我们的测试中,我们想打破依赖关系Collaborator及其错误,因此我们将模拟Collaborator。使用@Mock注释是为每个测试创建不同的模拟实例的便捷方法:
import static org.junit.Assert.*; import static org.mockito.Mockito.*; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.InjectMocks; import org.mockito.runners.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class ServiceTest { @Mock private Collaborator collaboratorMock; @InjectMocks private Service service; @Test public void testPerformService() throws Exception { // 配置模拟 doReturn("output").when(collaboratorMock).transformString("input"); // 执行测试 String actual = service.performService("input"); // 朱尼特断言 String expected = "output"; assertEquals(expected, actual); } @Test(expected=Exception.class) public void testPerformServiceShouldFail() throws Exception { // 配置模拟 doThrow(new Exception()).when(collaboratorMock).transformString("input"); // 执行测试 service.performService("input"); } }
Mockito将尝试按以下顺序解决依赖项注入:
基于构造函数的注入-使用大多数参数将模拟注入到构造函数中(如果找不到某些参数,则传递null)。如果通过构造函数成功创建了对象,则不会应用其他策略。
基于Setter的注入-模拟是按类型注入的。如果有多个相同类型的属性,则属性名称和模拟名称将匹配。
直接场注入-与基于二传手的注入相同。
请注意,如果上述任何策略失败,则不会报告失败。
请@InjectMocks在最新版本的Mockito中查询最新的有关此机制的更多详细信息。
问题内容: 谁能总结一下,究竟什么功能使您在Mockito的基础上添加了PowerMock? 到目前为止,我已经找到了这些: 模拟静态,最终和私有方法 删除静态初始化器 允许在没有依赖项注入的情况下进行嘲笑-我不清楚这一点。你能详细说明吗? 它还会添加其他内容吗?您可以分几行进行总结吗? 使用PowerMock时需要牺牲一些东西吗? 问题答案: 我不知道还有其他好处,但是我想解决您的两个子问题(这
我尝试为Spring Boot应用程序的以下服务类编写一个JUnit测试用例。 我试图用这个测试用例覆盖尽可能多的行 我认为语句“myService.myMethod(vetResp,req);”将运行真正的方法,因为myService用@Spy注释。但SonarQube扫描报告显示,该方法没有涵盖任何一行。 我是新来的。有人能告诉我我做错了什么吗?谢谢! 谢谢大家的投入。我用@InjectMoc
和许多其他人一样,我很兴奋地听到Mockito现在使用Android,并跟随本教程亲眼看到了它。一切似乎都很有趣,我开始将模拟解决方案纳入我的Android测试项目中。。。 但是,在设置我的应用程序的测试项目以利用、和jars时,我遇到了我的第一个测试用例的问题。事实上正是这个问题。我想要帮助的部分是; 我被告知,这“根本还不太管用”,因为堆栈跟踪意味着没有使用DexMaker jar——请参考此
Mockito 是一个针对 Java 的 mocking 框架。它与 EasyMock 和 jMock 很相似,但是通过在执行后校验什么已经被调用,它消除了对期望行为(expectations)的需要。其它的mocking库需要你在执行前记录期望行为(expectations),而这导致了丑陋的初始化代码。
我有下面一个班的方法。 使用mockito的junit测试用例将提供100%的代码覆盖率。
我在Spring服务中使用推土机。如何使用JUnit和Mockito将注入到已测试的服务中? 我的java类(如果简化)看起来像: 使用JUnit 4 Mockito Hamcrest的测试类如下所示: 问题在于模拟的Dozer实例没有按预期映射对象——默认情况下,Mockito存根返回空或空对象。如果我从测试中删除注释,它会抛出NPE!