2016-11-10 16 views
1

Допустим, у меня есть функция, чтобы проверить, как показано ниже:Как подключить входные данные функции с помощью powermock?

boolean MyFunction (String input1, Text rowkey) { 
    int a = 10; 
    a = a + 10; 
    return context.write(rowkey,a); 
} 

Обратите внимание, что context.write является функция, которая записывает в базу данных.

Я хотел бы высмеять эту функцию и проверить правильность ввода входных данных. Как мне это сделать?

В принципе, я могу сделать что-то вроде ниже (который я не могу показаться, чтобы добраться до работы):

PowerMockito.when(Context.write((Text) anyObject(), 
    (int) anyObject())).then(compareResult(input1,input2)); 

private Answer<Boolean> compareResults(input1, input2) { 
    AssertTrue(input1,this.Test1Input1AcceptanceCriteria) 
    AssertTrue(input2,this.Test1Input2AcceptanceCriteria) 
} 

ответ

0

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

@Test 
public void testMyFunction() throws Exception { 
    Context testContext = mock(Context.class); 
    MyFunction (input1, rowkey); // Call the function under test 
    // Now here is the magic. We use the verify technique to test 
    // the mocked class method while checking for equality with the acceptance criteria. 
    // In essence, the key is trap these underlying functions and ensure that 
    // they are passed in the right input from your function under test. 
    int expected_input_to_write = 10 
    Mockito.verify(testContext).write(eq((Object) new Text("test_string")), eq((Object) expected_input_to_write)); 
} 
1

Вы не должны делать это!

Предполагая, что контекст является поле вашего класса ограждающей, то вы «просто» должны найти способ, чтобы обеспечить версию издевались такого контекста объекта в ваш класс при тестировании.

Типичный способ здесь: инъекции зависимость

Как:

public class Foo { 
    private final Context context; 

    // some external constructor that you would use to create Foo objects 
    public Foo() { this (new Context(...)); } 

    // an internall ctor, used by your unit tests 
    Foo(Context context) { this.context = context; } 

И потом, вы можете писать тесты, такие как

@Test 
public void testMyFunction() { 
    Context context = ... create some mock 
    Foo underTest = new Foo(context); 
    underTest.myFunction(... 

Используя вышеупомянутый подход, ваш весь необходимо для Мощность насмешливый пропадает. Вы можете использовать «обычные» mocking frameworks, такие как Mokito или EasyMock, чтобы подготовить/проверить ваш объект контекста!

Понимаете, в конце концов, ваша проблема заключается в том, что созданный вами код просто сложно, если вы не задумываетесь об инъекции зависимостей. Если вы серьезно относитесь к тестированию, смотрите эти videos; они дают вам широкое представление о том, как создать тестовый код.