2011-09-03 205 views
1

我有一个将被测试代码:JUnit测试:静态方法调用到测试方法

public void ackAlert(final Long alertId, final String comment) { 
    final AnyTask task = AnyTask.create(
      "ackAlert", new Class[] { Long.class, String.class }, 
      new Object[] { alertId, comment }); 
    taskExecutor.execute(task); 
} 

我书面方式测试它:

public void testAckAlert() throws Exception { 

    final Long alertId = 1L; 
    final String comment = "tested"; 

    final AnyTask task = AnyTask.create(
    "ackAlert", new Class[] { Long.class, String.class }, 
    new Object[] { alertId, comment }); 

    taskExecutor.execute(task); 
    expectLastCall(); 

    replay(taskExecutor); 

    testingObjectInstance.ackAlert(alertId, comment); 

    verify(taskExecutor); 

} 

而且我得到异常:

java.lang.AssertionError: Unexpected method call execute([email protected]): execute([email protected]): expected: 1, actual: 0

我的错误在哪里?我觉得问题是在调用静态方法创建

+0

苏尔有没有Java的隔离/模拟框架,不需要过时的记录/重放语法? – TrueWill

+0

真的吗?你建议哪一个? –

+0

我没有在Java领域的建议;我是C#开发人员。 Java开源工具通常更成熟,所以这让我感到惊讶。我希望Java专家可以建议一个不同的库。 – TrueWill

回答

0

我没有看到你在创建你的模拟,但是,嘲笑静态方法调用不能用EasyMock完成。但是,PowerMock可以与EasyMock或Mockito一起使用至mock a static method call

您需要用@RunWith(PowerMockRunner.class)@PrepareForTest(AnyTask.class)注释您的测试类。然后,你的测试将是这个样子:

public void testAckAlert() throws Exception { 

    final Long alertId = 1L; 
    final String comment = "tested"; 
    mockStatic(AnyTask.class); 

    final AnyTask task = new AnyTask(); 
    expect(AnyTask.create(
    "ackAlert", new Class[] { Long.class, String.class }, 
    new Object[] { alertId, comment })).andReturn(task); 

    taskExecutor.execute(task); 
    expectLastCall(); 

    replay(AnyTask.class, taskExecutor); 

    testingObjectInstance.ackAlert(alertId, comment); 

    verify(taskExecutor); 

} 
1

它可能不是重要嘲笑你的静态方法,这取决于它是什么,你想测试。该错误是因为它看不到在您测试的方法中创建的任务等于您传递给模拟的任务。

你可以在AnyTask上实现equals和hashCode,以便它们看起来是等价的。在测试之后,您还可以“捕获”传递的任务以执行并验证相关内容。这将是这样的:

public void testAckAlert() throws Exception { 

    final Long alertId = 1L; 
    final String comment = "tested"; 
    mockStatic(AnyTask.class); 

    Capture<AnyTask> capturedTask = new Capture<AnyTask>(); 

    taskExecutor.execute(capture(capturedTask)); 
    expectLastCall(); 

    replay(taskExecutor); 

    testingObjectInstance.ackAlert(alertId, comment); 

    AnyTask actualTask = capturedTask.getValue(); 
    assertEquals(actualTask.getName(), "ackAlert"); 
    verify(taskExecutor); 

} 

如果你是不是真的测试有关的任务什么,但只是在taskExecutor.execute()被调用时,你可以简单地更换

taskExecutor.execute(task); 

taskExecutor.execute(isA(AnyTask.class)); 

或甚至

taskExecutor.execute(anyObject(AnyTask.class));