jew*_*ube 4 java methods junit mocking call
我正在编写一个JUnit测试并使用Mockito,我想调用一个方法,该方法又多次调用第二个方法.我不希望在单元测试期间调用第二种方法,但我想知道它的参数是什么.我要测试的代码看起来像这样:
public class MyClass {
public void myMethod() {
int a = [do some logic]
int b = [do some logic];
doSomething(a, b);
a = [do some logic];
b = [do some logic];
doSomething(a, b);
}
public void doSomething(int a, int b) {
// code that I do not want to be executed during a unit test
}
}
Run Code Online (Sandbox Code Playgroud)
现在进行单元测试:
@Test
public void test() {
MyClass myClass = new MyClass();
myClass.myMethod();
verify(myClass).doSomething(17, 33);
verify(myClass).doSomething(9, 18);
}
Run Code Online (Sandbox Code Playgroud)
我是Mockito的新手,我不知道A)是否可以阻止执行doSomething()和B)验证a&b参数的值.我愿意接受像"Mockito在这里不能帮助你"或"这不是技术上可行的东西"这样的答案.如果没有办法模仿这种事情,我可以考虑将那些[做一些逻辑]块重构为我可以直接测试的方法但是我的代码比这个简单的例子更复杂,我不允许在线发布代码.
要做到这一点,你需要一个Mockito部分模拟.
这是未经测试的,但我认为您想要的可能是以下内容:
@Test
public void test() {
MyClass myClass = spy(new MyClass());
doNothing().when(myClass).doSomething(any(Integer.class), any(Integer.class));
myClass.myMethod();
verify(myClass).doSomething(17, 33);
verify(myClass).doSomething(9, 18);
}
Run Code Online (Sandbox Code Playgroud)
该spy
套了部分模拟,这样就可以代替一些方法,并使用一些实际的方法.该doNothing
存根你doSomething
(一个有趣的巧合命名)做的,而不是调用真正的代码没有什么.
间谍是丑陋的.如果你在测试中部分嘲笑你的课程,你很容易对被嘲笑的内容和真正测试的内容感到困惑.Mockito的Javadoc明确警告不要进行部分嘲弄.
最好重构您的代码,以便您可以干净地测试它.提取doSomething()
到一个新类:
public class SomethingDoer {
public void doSomething(int a, int b) {
// code that you do not want to be executed during a unit test
}
}
Run Code Online (Sandbox Code Playgroud)
改变了MyClass:
public class MyClass {
private final SomethingDoer somethingDoer;
public MyClass(SomethingDoer somethingDoer) {
this.somethingDoer = somethingDoer;
}
public void myMethod() {
int a = [do some logic]
int b = [do some logic];
somethingDoer.doSomething(a, b);
a = [do some logic];
b = [do some logic];
somethingDoer.doSomething(a, b);
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
@Test
public void test() {
SomethingDoer somethingDoer = mock(SomethingDoer.class);
MyClass myClass = new MyClass(somethingDoer);
myClass.myMethod();
verify(somethingDoer).doSomething(17, 33);
verify(somethingDoer).doSomething(9, 18);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1599 次 |
最近记录: |