我正在调查哪个模拟框架用于我的项目,并将其缩小到JMockit和Mockito.
我注意到Mockito在Stackoverflow上被评为" Java最好的模拟框架 ".
在比较JMockit的" Mocking Tool Comparision Matrix "的功能时,似乎JMockit具有多种不同的功能.
有没有人有任何关于Mockito可以用JMockit无法实现的具体信息(不是意见),反之亦然?
我有一个执行DNS检查的命令行工具.如果DNS检查成功,则命令继续执行其他任务.我正在尝试使用Mockito为此编写单元测试.这是我的代码:
public class Command() {
// ....
void runCommand() {
// ..
dnsCheck(hostname, new InetAddressFactory());
// ..
// do other stuff after dnsCheck
}
void dnsCheck(String hostname, InetAddressFactory factory) {
// calls to verify hostname
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用InetAddressFactory来模拟类的静态实现InetAddress.这是工厂的代码:
public class InetAddressFactory {
public InetAddress getByName(String host) throws UnknownHostException {
return InetAddress.getByName(host);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的单元测试用例:
@RunWith(MockitoJUnitRunner.class)
public class CmdTest {
// many functional tests for dnsCheck
// here's the piece of code that is failing
// in this test …Run Code Online (Sandbox Code Playgroud) 我在junit测试中使用mockito.你怎么做一个异常发生然后断言它有(通用伪代码)
考虑以下代码:
public class DummyClass {
public List<? extends Number> dummyMethod() {
return new ArrayList<Integer>();
}
}
Run Code Online (Sandbox Code Playgroud)
public class DummyClassTest {
public void testMockitoWithGenerics() {
DummyClass dummyClass = Mockito.mock(DummyClass.class);
List<? extends Number> someList = new ArrayList<Integer>();
Mockito.when(dummyClass.dummyMethod()).thenReturn(someList); //Compiler complains about this
}
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨正在尝试存根行为的行dummyMethod().关于如何使用有界通配符返回类型的存根方法的任何指针?
争论的Mockito匹配器(如any,argThat,eq,same,和ArgumentCaptor.capture())表现非常不同,从Hamcrest匹配器.
Mockito匹配器经常导致InvalidUseOfMatchersException,即使在使用任何匹配器后执行很长时间的代码中也是如此.
Mockito匹配器受到奇怪的规则的影响,例如,如果给定方法中的一个参数使用匹配器,则只需要对所有参数使用Mockito匹配器.
当覆盖Answers或使用(Integer) any()等时,Mockito匹配器可能会导致NullPointerException .
使用Mockito匹配器以某种方式重构代码可能会产生异常和意外行为,并且可能完全失败.
为什么Mockito匹配器是这样设计的,它们是如何实现的?
任何人都可以请给我一个例子,说明什么是org.mockito.ArgumentCaptor类的使用,以及它与mockito提供的简单匹配器有何不同.
我阅读了所提供的mockito文档,但这些文档没有清楚地说明,也没有能够清楚地解释它.
鉴于以下Mockito声明:
when(mock.method()).thenReturn(someValue);
Run Code Online (Sandbox Code Playgroud)
考虑到mock.method()语句将返回值传递给when(),Mockito如何为mock创建代理?我想这会使用一些CGLib的东西,但有兴趣知道这是如何在技术上完成的.
有许多方法可以使用MockIto初始化模拟对象.这些中最好的方法是什么?
1.
public class SampleBaseTestCase {
@Before public void initMocks() {
MockitoAnnotations.initMocks(this);
}
Run Code Online (Sandbox Code Playgroud)
2.
@RunWith(MockitoJUnitRunner.class)
Run Code Online (Sandbox Code Playgroud)
[编辑] 3.
mock(XXX.class);
Run Code Online (Sandbox Code Playgroud)
建议我,如果有任何其他方法比这些更好......
在创建测试和模拟依赖项时,这三种方法之间有什么区别?
@MockBean:
@MockBean
MyService myservice;
Run Code Online (Sandbox Code Playgroud)@嘲笑:
@Mock
MyService myservice;
Run Code Online (Sandbox Code Playgroud)Mockito.mock()
MyService myservice = Mockito.mock(MyService.class);
Run Code Online (Sandbox Code Playgroud)我正在使用Mockito进行后期单元测试.我很困惑,当使用doAnswerVS thenReturn.
任何人都可以帮我详细吗?到目前为止,我已经尝试过了thenReturn.
mockito ×10
java ×9
unit-testing ×5
junit ×4
mocking ×3
generics ×1
jmockit ×1
spring ×1
spring-boot ×1