当调用最终void方法时,我正在尝试将((donothing((,但是donothing((调用正在调用实际方法。
switchworker class
public class SwitchWorker {
public boolean switchMethod(String id){
this.methodA(id);
return true;
}
public void methodA(String id){
final Switch switchObj = Switch.getSwitchInstance();
switchObj.finalVoidMethod(id);
// XYZ......
}
}
开关类
public final class Switch {
private static final Switch INSTANCE = new Switch();
private Switch() { //Private Constructor
super();
}
public static Switch getSwitchInstance() {
return INSTANCE;
}
public final synchronized void finalVoidMethod(String param) {
// Do Something
}
}
测试代码:
@RunWith(PowerMockRunner.class)
@SuppressStaticInitializationFor("com.application.switching.Switch")
public class SwitchWorkerTest {
@Test
public void test() throws Exception {
SwitchWorker swObj = new SwitchWorker();
final String channelId = "0001";
Switch switchMock = mock(Switch.class);
PowerMockito.mockStatic(Switch.class);
when(Switch.getSwitchInstance()).thenReturn(switchMock);
doNothing().when(switchMock).finalVoidMethod(channelId);
boolean result = swObj.switchMethod(channelId);
assertTrue(result);
}
我是否错过了donothing((方法的任何东西?
"doNothing().when(switchMock).finalVoidMethod(channelId);"
donothing((正在调用实际的finalVoidMethod((,而不是嘲笑。但是,SwitchMock是一个模拟的对象。
我已经在堆栈溢出上查看了有关PowerMockito,嘲笑静态方法和塑子方法的所有问题,我不确定是否缺少任何内容,因为我遵循大多数示例来构建代码。我也添加了@preparefortest,但后来删除了它。
谢谢。
编辑:我将代码删除更加抽象,并稍微更改为@kswaughs评论
public boolean mockedMethod(final String input) {
System.out.println("0----------------------");
final Switch switchObj = Switch.getSwitchInstance();
System.out.println("1:switchObj: "+ switchObj);
switches.refresh("input");
System.out.println("2----------------------");
return true;
}
使用测试代码:
@RunWith(PowerMockRunner.class)
@PrepareForTest({Switch.class, SwitchWorker.class})
public class SwitchWorkerTest {
@Test
public void test() throws Exception {
SwitchWorker swObj = new SwitchWorker();
Switch switchMock = mock(Switch.class);
PowerMockito.mockStatic(Switch.class);
when(Switch.getSwitchInstance()).thenReturn(switchMock);
boolean result = swObj.mockedMethod("0001");
assertTrue(result);
返回。
0----------------------
1:switchObj: Mock for Switch, hashCode: 1659309731
java.lang.NullPointerException
at com.application.switching.Switch.refresh(Switch.java:238)
at com.application.switching.SwitchWorker$1.run(SwitchWorker.java:51)
更改使用PowerMockito的所有方法后,我意识到模拟对象本身是使用Mockito初始化的。
更改:
Switch switchMock = mock(Switch.class);
到(或更改导入(:
Switch switchMock = PowerMockito.mock(Switch.class);
解决了我的问题。
感谢贡献的人(像这样的小事情是我的祸根(
我举办了你的示例,它适合我。在这里要记住的两件事。
-
嘲笑对象时,模拟对象的方法将不会执行,如果它们具有任何返回类型,则默认情况下将返回null。对于无效方法,您不必明确设置期望。
-
要嘲笑最后一堂课,您必须在PreparFortest中声明它。
请检查您是否具有Mockito&PowerMockito。
我按照下面的示例进行了示例。
maven
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.6</version>
<scope>test</scope>
</dependency>
测试代码
package com.kswaughs;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.when;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(Switch.class)
public class SwitchWorkerTest {
@Test
public void test() throws Exception {
SwitchWorker swObj = new SwitchWorker();
final String channelId = "0001";
Switch switchMock = mock(Switch.class);
PowerMockito.mockStatic(Switch.class);
when(Switch.getSwitchInstance()).thenReturn(switchMock);
boolean result = swObj.switchMethod(channelId);
Assert. assertTrue(result);
}
}
donothing((方法将调用实际方法,如果您不想打电话,则可以使用undress-method。
doNothing().when(switchMock).finalVoidMethod(channelId);
更改
suppress(method(SwitchWorker.class, "finalVoidMethod"));