首页 > 解决方案 > 如何将 expectNew 用于具有泛型参数的构造函数?

问题描述

我需要将模拟对象注入到MyClass实例化新对象的方法中。

private MyClass<?> c;

public void myMethod(final String s) {

   c = new MyClass<>(s);

   c.callToMock();
}

我正在模拟的类有一个带有泛型参数的构造函数。

public class MyClass<T> {

   public MyClass(final T t) {
      // do whatever
   }
}

现在,在我的测试中,我为班级创建了一个模拟。当new被调用时,它应该注入那个模拟。

@RunWith (PowerMockRunner.class)
public class TestClass {

   @SuppressWarnings ("unchecked")
   public void myMethodTest() throws Exception {

      MyClass<String> myMock = (MyClass<String>) EasyMock.createMock(MyClass.class);

      PowerMock.expectNew(MyClass.class, "my argument")
               .andReturn(myMock);
      myMock.callToMock();
      EasyMock.expectLastCall().once();

      EasyMock.replay(myMock);
      PowerMock.replayAll();

      ...

   }

当我运行测试时,它没有捕捉到new调用,只是实例化了一个实际的MyClass对象。我不知道它是否无法匹配构造函数或什么。

任何帮助将不胜感激,谢谢。

标签: javapowermockeasymock

解决方案


您需要@PrepareForTest(MyTestedClass.class)在测试类上添加一个以准备测试类来模拟new.

这是一个完整的工作测试:

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyTestedClass.class)
public class TestClass {

    @Test
    @SuppressWarnings("unchecked")
    public void myMethodTest() throws Exception {

        MyClass<String> myMock = (MyClass<String>) EasyMock.createMock(MyClass.class);
        myMock.callToMock();

        PowerMock.expectNew(MyClass.class, "my argument")
                .andReturn(myMock);

        EasyMock.replay(myMock);
        PowerMock.replayAll();

        MyTestedClass tested = new MyTestedClass();
        tested.myMethod("my argument");
    }
}

推荐阅读