Я использую тест Spock, написанный на Groovy, чтобы проверить некоторый Java-код. Я использую JMockit для имитации методов в java-коде, поскольку Спок обрабатывает только имитирующие классы Groovy. Я столкнулся с проблемой, когда JMockit MockUp
сохраняется между тестами. Такой макет должен существовать только для теста (согласно документации JMockit), но это не работает, и я полагаю, это потому, что он не использует средство запуска тестов JMockit, а скорее средство запуска тестов Spock.
Вот простейший пример проблемы, с которой я столкнулся. У меня есть простой метод, возвращающий строку, я могу изменить возвращаемое значение метода с помощью MockUp
, но он все еще существует для третьего теста, который не ожидает его использования.
Класс Java
public class ClassToTest {
public String method() {
return "original";
}
}
Тест Спока
class ClassToTestSpec extends Specification {
void "first test"() {
when:
String result = new ClassToTest().method()
then:
result == "original"
}
void "second test"() {
setup:
new MockUp<ClassToTest>() {
@Mock
public String method() {
return "mocked"
}
}
when:
String result = new ClassToTest().method()
then:
result == "mocked"
}
void "third test"() {
when:
String result = new ClassToTest().method()
then:
result == "original"
}
}
Третий тест не проходит, потому что ClassToTest.method()
по-прежнему возвращает строку «mocked», а не «original». С помощью отладчика я подтвердил, что метод Mocked вызывается дважды.
Вопрос
Есть ли способ вручную удалить класс MockUp
в JMockit? Спасибо.
instance.method() >> result
, вы можете указать мне правильное направление? - person mnd   schedule 31.12.2014Mock
, напримерClassToTest instance = Mock(ClassToTest)
. Теперь выясним, как сделать это частичной имитацией, возможно, с помощью шпиона. - person mnd   schedule 31.12.2014Spy()
- это то, что вам нужно. Часто лучше провести рефакторинг тестируемого кода или пересмотреть, что и как тестировать. - person Peter Niederwieser   schedule 31.12.2014