Java单元测试Mockito以及复杂方法验证
什么是Mock 测试?
简单的说Mock就是方便测试。他能方便我们去做哪些事情,比如你在单元测试中不易构造的方法或者是你在创建对象的时候很难创建(其中的原因可能是你的测试对象在创建的时候需要传入一种不易被创建的参数)。
Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为。
下面是我的代码:
//这是我的一个实体类实现了A
public class Aa implements A {
private PrintStream stream;
public Aa(PrintStream stream) {
this.stream = stream;
}
public void embark() {
stream.println("aaaaaaaaa");
}
}
//这是我的另一个类它实现了K
public class B implements K {
private Q q;
/**
* 动态输入参数进行embark()方法的调用,这样就可以多个类进行调用,依赖注入
* 构造器注入
* 松耦合
* @param q
*/
public B(Q q) {
this.q = q;
}
public void embarkOnQuest() {
q.embark();
}
}
//接口类K
public interface K {
void embarkOnAa();
}
//接口A
public interface A{
void embark();
}
//测试Junit
@Test
public void test(){
SlayDragonQuest mock = mock(Aa.class);//Mock Aa的创建
B b = new B(mock);//注入Mock Aa
b.embarkOnAa();
verify(mock,times(1)).embark();//进行我预期的验证,我的预期是该方法会被执行一次
}
如果我想要去看我的Aa 类是否能动态的通过B的构造器依赖注入进去,但是我需要这两个类的实例,而Aa类的创建需要传入PrintStream类型的值,我们测试的时候并不想去创建他的入参进行单元测试那么我们就可以使用Mock进行测试
这个就是Mock方便我们的测试
这里边我们还用到了一个方法为verify()
预期验证verify()
他有两种方式
1、 verify(T mock, VerificationMode mode)
mode 可以传入其他参数,我们预测次数我们就使用times(int wantedNumberOfInvocations)
他还可以输入很多 never()等等
2、verify(T mock)
这是他的方法,默认一次要是不输入的话,我们可以验证方法执行多少次是否和我们一起一样,不一样会提示。
@CheckReturnValue
public static <T> T verify(T mock) {
return MOCKITO_CORE.verify(mock, times(1));
}