2016-10-24 3 views
1

Я пишу тесты Junit в первый раз и новые для рамки Mockito. Как использовать Mockito.mock() лучше, чем с помощью оператора new для создания экземпляров при написании тестов Junit в Java?Как Mockito.mock лучше использовать новые при написании тестов Junit?

+0

Это не лучше в целом - это может быть лучше в некоторых обстоятельствах. – assylias

+0

Возможный дубликат [Mockito, JUnit and Spring] (http://stackoverflow.com/questions/10906945/mockito-junit-and-spring) – DimaSan

+0

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

ответ

2

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()); 
} 
2

Вы, кажется, здесь ошибаетесь.

используется насмешливым для создания «замены объектов», которые вы какой-то образом прохода в код испытуемого. Как здесь:

// production code 
someObject.expensiveCall(); 

Mocking позволяет дать объект в код тестируемой где что expensiveCall() не просто «не-оп»; и вдобавок ко всему: вы также можете использовать это, чтобы убедиться, что именно это было сделано из вашего производственного кода.

Таким образом: вы являетесь не, используя «издевку», чтобы создавать объекты для запуска тестов; их единственная цель - сделать тестирование действительно возможным или, по крайней мере, облегчить тестирование. См. here для получения более подробной информации.

Это не значит, что вы абсолютно имеете, чтобы использовать насмешливые повсюду. Наоборот: если вы можете написать простой тест, как:

@Test 
public void testWhatever() { 
    assertThat(new Whatever().computeSomething(), is(some expected result)); 
} 

, что это лучший путь (тесты только дело с входами и выходами вашей «коды испытываемыми»); другими словами: вы проверяете контракты, не имея дело с каким-либо внутренним кодом вашего производственного кода.

+0

Спасибо. Это было полезно. –

+0

Добро пожаловать; не стесняйтесь повышать/принимать в любой момент ;-) – GhostCat