我需要使用mockito使用final方法模拟一些类.我写过这样的东西
@Test
public void test() {
B b = mock(B.class);
doReturn("bar called").when(b).bar();
assertEquals("must be \"overrided\"", "bar called", b.bar());
//bla-bla
}
class B {
public final String bar() {
return "fail";
}
}
Run Code Online (Sandbox Code Playgroud)
但它失败了.我尝试了一些"黑客",它的确有效.
@Test
public void hackTest() {
class NewB extends B {
public String barForTest() {
return bar();
}
}
NewB b = mock(NewB.class);
doReturn("bar called").when(b).barForTest();
assertEquals("must be \"overrided\"", "bar called", b.barForTest());
}
Run Code Online (Sandbox Code Playgroud)
它有效,但"闻起来".
那么,正确的方式在哪里?
谢谢.
我正在为一个有两个方法methodA,methodB的类编写JUnit Test案例.我想在我的测试用例中模拟从methodA调用methodB我在我正在测试的类上使用spy,但仍然执行了methodB.
这是班级
public class SomeClass
{
public Object methodA(Object object)
{
object=methodB(object);
return object;
}
public Object methodB(Object object)
{
//do somthing
return object;
}
}
Run Code Online (Sandbox Code Playgroud)
这是测试类
@RunWith( org.powermock.modules.junit4.legacy.PowerMockRunner.class )
@PrepareForTest(SomeClass.class)
public class SomeClassTest {
private SomeClass var = null;
@Before
public void setUp() {
var=new SomeClass();
}
@After
public void tearDown()
{
var= null;
}
@Test
public void testMethodA_1()
throws Exception {
Object object =new Object();
SomeClass spy_var=PowerMockito.spy(var);
PowerMockito.when(spy_var.methodB(object)).thenReturn(object);
Object result = var.methodA(object);
assertNotNull(result);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然我已经模拟了它,但方法B仍然可以调用它.但是PLease建议我使用适当的方法来模拟同一类的methodA中的methodB调用.
class Temp() {
public boolean methodA(String param) {
try {
if(methodB(param))
return true;
return false;
} catch (Exception e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
测试类
@Test
public void testMethodA() {
Temp temp = new Temp();
Temp spyTemp = Mockito.spy(temp);
Mockito.doReturn(true).when(spyTemp).methodB(Mockito.any());
boolean status = temp.methodA("XYZ");
Assert.assertEquals(true, status);
}
Run Code Online (Sandbox Code Playgroud)
当调用真实类 temp 到 methodA 时,应该返回模拟的方法 B 值。因此返回true。为什么这是不正确的。我遇到了同样的问题。我想在真正的班级上运行测试,而不是按照答案的建议运行模拟对象。我想运行类 methodA 并在调用时期望模拟对象 spyTemp methodB 值