Mockito-模拟库调用

时间:2019-02-07 21:57:28

标签: java mockito

我具有以下结构

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;
    }
}

感谢您的帮助!

3 个答案:

答案 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
    }
}