【问题标题】:How to use expectNew for constructor with generic parameter?如何将 expectNew 用于具有泛型参数的构造函数?
【发布时间】:2018-05-02 19:34:13
【问题描述】:

我需要将一个模拟对象注入一个实例化新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 对象。 不知道是不能匹配构造函数还是什么。

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

【问题讨论】:

    标签: java powermock easymock


    【解决方案1】:

    您需要在您的测试类上添加一个@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");
        }
    }
    

    【讨论】:

    • 完全正确。我在发布后不久就弄清楚了哈哈。当然这是最简单的解决方案
    猜你喜欢
    • 2011-12-26
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多