代码之家  ›  专栏  ›  技术社区  ›  Muthu

EasyMock模拟方法调用在重置模拟对象后第二次调用时返回null

  •  0
  • Muthu  · 技术社区  · 11 年前

    这是我在Stackoverflow的第一篇帖子,到目前为止,我一直是这个论坛的活跃读者,我在这里发布了我的第一个问题。

    这是关于EasyMock的使用,我是EasyMok的新用户,在下面的示例代码中,我正在为返回具有相同对象的合作者方法设置期望值(无论是相同对象还是不同对象,但结果是相同的),并且在退出测试方法之前我正在重置。但当执行第二个测试时,mocked方法返回null,我不确定为什么会发生这种情况。

    如果我运行这些方法

    @RunWith(PowerMockRunner.class)
    @PrepareForTest({CollaboratorWithMethod.class, ClassTobeTested.class})
    public class TestClassTobeTested {
    
    private TestId testId = new TestId();
    
     @Test
    public void testMethodtoBeTested() throws Exception{
        CollaboratorWithMethod mockCollaborator = EasyMock.createMock(CollaboratorWithMethod.class);
        PowerMock.expectNew(CollaboratorWithMethod.class).andReturn(mockCollaborator);
        EasyMock.expect(mockCollaborator.testMethod("test")).andReturn(testId);
        PowerMock.replay(CollaboratorWithMethod.class);
        EasyMock.replay(mockCollaborator);
        ClassTobeTested testObj = new ClassTobeTested();
        try {
            testObj.methodToBeTested(); 
        } finally {
            EasyMock.reset(mockCollaborator);
            PowerMock.reset(CollaboratorWithMethod.class);
        }
    }  
    
    @Test
    public void testMothedtoBeTestWithException() throws Exception {
        CollaboratorWithMethod mockCollaborator = EasyMock.createMock(CollaboratorWithMethod.class);
        PowerMock.expectNew(CollaboratorWithMethod.class).andReturn(mockCollaborator);
        EasyMock.expect(mockCollaborator.testMethod("test")).andReturn(testId);
        PowerMock.replay(CollaboratorWithMethod.class);
        EasyMock.replay(mockCollaborator);
        ClassTobeTested testObj = new ClassTobeTested();
        try {
            testObj.methodToBeTested();
        } finally {
            EasyMock.reset(mockCollaborator);
            PowerMock.reset(CollaboratorWithMethod.class);
        }
    }
    

    }

    这是我的合作者课程

    public class CollaboratorWithMethod {
       public TestId testMethod(String text) throws IllegalStateException {
         if (text != null) {
            return new TestId();
         } else {
            throw new IllegalStateException();
         }
      }
    }
    

    这是我要考的课

    public class ClassTobeTested {
    
    public static final CollaboratorWithMethod collaborator = new CollaboratorWithMethod();
    
    public void methodToBeTested () throws IOException{
        try {
            TestId testid = collaborator.testMethod("test");
            System.out.println("Testid returned "+ testid);
        } catch (IllegalStateException e) {
            throw new IOException();
        }
    }
    }
    

    我正在寻求你们的帮助,以了解这里到底发生了什么

    1 回复  |  直到 11 年前
        1
  •  0
  •   Bhushan Bhangale    11 年前

    这个 collaborator 类中的变量 ClassTobeTested 是最终的。第一个测试用例使用mock对象初始化变量。第二个测试用例无法再次初始化变量。您对第二个测试用例中创建的模拟对象设置了期望值,但实际上该变量仍然引用第一个模拟对象。

    由于您不想修改类,因此应该使用@BeforeClass设置一次mock引用,并将“mockCollaborator”作为全局变量,以便您可以在多个测试用例中使用该引用。