我具有以下结构
public class classAImpl implements classA {
public ClassC getTarget(Classc cObj) {
// library call
RegistryLib.init();
// some more code to construct cObj with more info
return cObj
}
}
// Registry Library Class
Class RegistryLibClass{
public void init() {
ClassD.builder.build();
}
}
我的测试类正在尝试测试调用上面编写的getTarget()方法的方法。我想完全避免执行getTarget()方法,即使在模拟它后也无法执行。到目前为止,我已经尝试了以下方法:
Class Testclass {
@Before
public void setUp() {
Testclass mock = PowerMockito.mock(Testclass.class);
PowerMockito.when(mock.getTarget(cObj)).thenReturn(cObj);
}
private ClassC getTarget(cObj) {
return cObj;
}
}
感谢您的帮助!
答案 0 :(得分:0)
免责声明-我对Mockito并不熟悉,但是您通常不会嘲笑要避免使用的类吗?像这样:
class Testclass {
@Before
public void setUp() {
//create some mock of expected cObj here to be returned.
classAImpl mock = PowerMockito.mock(classAImpl.class);
PowerMockito.when(
mock.getTarget(cObj.class /*Shouldn't this be class call?*/))
.thenReturn(cObj);
}
}
然后将模拟作为依赖项注入使用它并要测试的对象中。
如果我错了,请随时忽略我,但这就是我使用的其他模拟库的工作方式。我建议您无论如何都要阅读一些有关模拟测试的教程。
请注意,在名称中使用Class和class使得此示例非常难以理解。
答案 1 :(得分:0)
假设您要测试Class B
中从getTarget
调用Class A
的方法,您可以这样做
B b = new B();
A a = Mockito.mock(A.class);
C c = new C();
Mockito.when(a.getTarget(Mockito.any(C.class)).thenReturn(c);
boolean isPresent = b.someMethodToTest();
assertEquals("someMethodToTest was supposed to return true", true/*expected*/, isPresent);
编辑#1 您需要使用Powermockito模拟静态方法以不返回任何内容,如here
@PrepareForTest(RegistryLibClass.class) //at the top of the class
//inside your test
PowerMockito.mockStatic(RegistryLibClass.class);
Mockito.when(RegistryLibClass.init()).doNothing();
答案 2 :(得分:0)
您的示例非常令人困惑,因为您试图模拟自己的测试类而不是主类。
您还提到过,您正在尝试测试一个调用getTarget()方法的方法,但是我在您的类中没有看到任何调用 getTarget()的方法。 em>方法。
为了您的理解,我在下面写下了一个简单的例子。让我知道是否有帮助。
ClassA
public class ClassA {
public String method1() {
return "ClassA -> method1";
}
public static String method2() {
return "ClassA -> method2";
}
}
ClassB调用A类方法
public class ClassB {
public void method1() {
System.out.println("ClassB -> method1");
new ClassA().method1();
ClassA.method2();
}
}
ClassB测试
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassA.class)
public class ClassBTest {
@Mock
ClassA mock;
@Before
public void setUp() throws Exception {
// Initialize mocks
MockitoAnnotations.initMocks(this);
// This is for mocking new objects
PowerMockito.whenNew(ClassA.class).withNoArguments().thenReturn(mock);
PowerMockito.when(mock.method1()).thenReturn("Mocked Method 1");
// This is for mocking static methods
PowerMockito.mockStatic(ClassA.class);
PowerMockito.when(ClassA.method2()).thenReturn("Mocked Method 2");
}
@Test
public void testMeth() {
System.out.println(new ClassA().method1()); // Prints - Mocked Method 1
System.out.println(ClassA.method2()); // Prints - Mocked Method 2
}
}