Junit测试:将静态方法调用到测试方法中

时间:2011-09-03 14:44:13

标签: junit easymock

我有一个将要测试的代码:

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:意外的方法调用   执行(com.alert.bundle.model.AnyTask@4cbfea1d):       执行(com.alert.bundle.model.AnyTask@65b4fad5):预期:1,   实际:0

我的错误在哪里?我认为问题在于调用静态方法 create

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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);

}