Тест Junit: вызов статического метода в метод тестирования - PullRequest
1 голос
/ 03 сентября 2011

У меня есть код, который будет проверен:

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 ]

1 голос
/ 04 сентября 2011

Может быть не важно издеваться над вашим статическим методом, в зависимости от того, что именно вы хотите проверить.Ошибка в том, что она не видит задачу, созданную в тестируемом вами методе, как задачу, которую вы передали макету.

Вы можете реализовать equals и hashCode в AnyTask, чтобы они выглядели эквивалентно.Вы также можете «захватить» переданную задачу, чтобы выполнить и проверить что-то об этом после теста.Это выглядело бы так:

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));
0 голосов
/ 04 сентября 2011

Я не вижу, где вы создаете свои макеты, но да, макетирование статического вызова метода не может быть выполнено одним EasyMock.Тем не менее, PowerMock может использоваться с EasyMock или Mockito для макетирования статического вызова метода .

Вам необходимо аннотировать ваш тестовый класс с помощью @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);

}
...