donothing()方法正在调用实际方法



当调用最终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);

解决了我的问题。

感谢贡献的人(像这样的小事情是我的祸根(

我举办了你的示例,它适合我。在这里要记住的两件事。

  1. 嘲笑对象时,模拟对象的方法将不会执行,如果它们具有任何返回类型,则默认情况下将返回null。对于无效方法,您不必明确设置期望。

  2. 要嘲笑最后一堂课,您必须在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"));

相关内容

  • 没有找到相关文章

最新更新