Я пишу тесты Junit в первый раз и новые для рамки Mockito. Как использовать Mockito.mock()
лучше, чем с помощью оператора new
для создания экземпляров при написании тестов Junit в Java?Как Mockito.mock лучше использовать новые при написании тестов Junit?
ответ
Mockito может использоваться для инъекций зависимостей, которые могут отсутствовать в текущем контексте тестирования, а не для создания «фиктивных» объектов для тестирования. Эти макетные объекты - это не настоящая вещь, а «пустые» версии издевающегося класса, на которых вы можете запускать всевозможные методы моделирования поведения и проверки результатов, которые предоставляются Mockito.
Например следующий класс:
class Thing {
//Some external Dependency which provides the method 'int doWork()'
private Dependency dependency;
private int value;
public void setDependency(Dependency dependency) {
this.dependency = dependency;
}
public int getValue() {
return value;
}
// Calculates something depending on the provided amount.
public void calculate(int amount) {
for(int i = 0; i < amount; i++) {
value += dependency.doWork();
}
}
}
Тогда вы могли бы сделать что-то подобное в вашем тесте:
@Test
public void should_calculate_five_times() {
// Create mock object
Dependency dependencyMock = Mockito.mock(Dependency.class);
// Simulate the behaviour of the mock object
Mockito.when(dependencyMock.doWork()).thenReturn(2);
// Create object under test
Thing thingToTest = new Thing();
// Inject mock object
thingToTest.setDependency(dependencyMock);
// Execute method to test
thingToTest.calculate(5);
// Expected: dependency.doWork() should have been called 5 times
Mockito.verify(dependencyMock, Mockito.times(5)).doWork();
// Since dependencyMock returns 2, when doWork() is called, value should be 10
Assert.assertEquals(10, thingToTest.getValue());
}
Вы, кажется, здесь ошибаетесь.
используется насмешливым для создания «замены объектов», которые вы какой-то образом прохода в код испытуемого. Как здесь:
// production code
someObject.expensiveCall();
Mocking позволяет дать объект в код тестируемой где что expensiveCall()
не просто «не-оп»; и вдобавок ко всему: вы также можете использовать это, чтобы убедиться, что именно это было сделано из вашего производственного кода.
Таким образом: вы являетесь не, используя «издевку», чтобы создавать объекты для запуска тестов; их единственная цель - сделать тестирование действительно возможным или, по крайней мере, облегчить тестирование. См. here для получения более подробной информации.
Это не значит, что вы абсолютно имеете, чтобы использовать насмешливые повсюду. Наоборот: если вы можете написать простой тест, как:
@Test
public void testWhatever() {
assertThat(new Whatever().computeSomething(), is(some expected result));
}
, что это лучший путь (тесты только дело с входами и выходами вашей «коды испытываемыми»); другими словами: вы проверяете контракты, не имея дело с каким-либо внутренним кодом вашего производственного кода.
Спасибо. Это было полезно. –
Добро пожаловать; не стесняйтесь повышать/принимать в любой момент ;-) – GhostCat
Это не лучше в целом - это может быть лучше в некоторых обстоятельствах. – assylias
Возможный дубликат [Mockito, JUnit and Spring] (http://stackoverflow.com/questions/10906945/mockito-junit-and-spring) – DimaSan
Вы игнорируетесь, потому что это широкий и в первую очередь вопрос, основанный на мнениях. Попробуйте перефразировать, задав более прямой или конкретный технический вопрос. –