Неожиданный вызов метода при выполнении модульного тестирования с EasyMock - PullRequest
0 голосов
/ 15 сентября 2011

Я тестирую функциональность почты в моем коде с помощью UnitilsJUnit4 и EasyMock.

Мой код похож на это ..

public void prepare(MimeMessage mimeMessage) {
// some code ..
MimeMessageHelper message = new MimeMessageHelper( mimeMessage, true );
// some mail settings ..

}

, когда я тестирую метод prepare, он дает следующее исключение ... но метод, который он показывает ниже, взят изSpring Framework Framework.

java.lang.AssertionError: 
  Unexpected method call setContent(javax.mail.internet.MimeMultipart@6e616e61):
    setContent(javax.mail.internet.MimeMultipart@2dda2dda): expected: 1, actual: 0
    at $javax.mail.internet.MimeMessage$$EnhancerByCGLIB$$614de43f.setContent(<generated>)
    at org.springframework.mail.javamail.MimeMessageHelper.createMimeMultiparts(MimeMessageHelper.java:344)
    at org.springframework.mail.javamail.MimeMessageHelper.<init>(MimeMessageHelper.java:290)
    at org.springframework.mail.javamail.MimeMessageHelper.<init>(MimeMessageHelper.java:247)
    at org.springframework.mail.javamail.MimeMessageHelper.<init>(MimeMessageHelper.java:226)

Пожалуйста, помогите мне решить вышеуказанную проблему .. Как проверить мой метод?

Ответы [ 3 ]

2 голосов
/ 29 августа 2012

Я знаю, что это было написано давно, но я только что столкнулся с точно такой же проблемой.

Если вы можете издеваться над MimeMessageHelper в той или иной форме, вы можете легко протестировать код. Я сделал это, создав интерфейс, который просто возвращает класс MimeMessageHelper, и добавил его в качестве зависимости к классу, который я тестировал.

Интерфейс:

public interface MimeMessageHelperProvider {
    MimeMessageHelper getMimeMessageHelper(MimeMessage mimeMessage);
}

Осуществление:

public class MimeMessageHelperProviderImpl implements MimeMessageHelperProvider {
    @Override
    public MimeMessageHelper getMimeMessageHelper(MimeMessage mimeMessage) {
        return new MimeMessageHelper(mimeMessage);
    }
}

Теперь вы можете подключить MimeMessageHelperProvider и просто смоделировать этот интерфейс, чтобы он возвращал вам экземпляр, с которым вы можете проверить.

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

Вам нужно издеваться над MimeMessageHelper. Вы не можете внедрить его, потому что он принимает mimeMessage в конструкторе. Поэтому для этого вам нужно что-то вроде PowerMock .

Из документации :

  1. Используйте аннотацию @RunWith (PowerMockRunner.class) на уровень класса теста.
  2. Используйте @PrepareForTest (ClassThatCreatesTheNewInstance.class) аннотация в уровень класса теста.
  3. Использование PowerMock.createMock (NewInstanceClass.class) для создания макета объект класса, который должен быть построен (назовем его mockObject).
  4. Использование PowerMock.expectNew (NewInstanceClass.class) .andReturn (mockObject) в ожидать нового строительства объекта типа NewInstanceClass.class, но вместо этого возвращает фиктивный объект.
  5. Использование PowerMock.replay (mockObject, NewInstanceClass.class) для изменения макет объекта и класса в режиме воспроизведения, альтернативно используйте Метод PowerMock.replayAll ().
  6. Использовать PowerMock.verify (mockObject, NewInstanceClass.class), чтобы изменить макет объекта и класса на режим проверки, в качестве альтернативы используйте метод PowerMock.verifyAll ().

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

@RunWith(PowerMockRunner.class)
@PrepareForTest(MessagePreparer.class)
public class MessagePreparerTest {

  @Test
  public void testPrepare() {
    MimeMessage mockMessage = PowerMock.createMock(MimeMessage.class);
    MimeMessageHelper mockMessageHelper = PowerMock.createMock(MimeMessageHelper.class);
    PowerMock.expectNew(MimeMessageHelper.class, 
                        mockMessage, true).andReturn(mockMessageHelper);
    // ...set other expectations
    PowerMock.replay(mockMessage, mockMessageHelper, MimeMessageHelper.class);
    MessagePreparer messagePreparer = new MessagePreparer();
    messagePreparer.prepare(mockMessage);
    PowerMock.verify(mockMessage, mockMessageHelper, MimeMessageHelper.class);
  }
}
1 голос
/ 15 сентября 2011

Вы, кажется, издеваетесь не над тем. Вы издеваетесь над Почтовым API, когда надо издеваться над классом Spring, поскольку именно с этим вы взаимодействуете напрямую. То, как вы делаете это сейчас, вы эффективно тестируете класс Spring вместе со своим собственным, что не совсем то, что вам нужно.

...