2015-01-01 3 views
2

Я пытаюсь написать тестовый пример для класса java. Я издевался над методом, использующим Mockito, но макет никогда не используется. Зачем?Метод mocked никогда не набирается

Ниже представлена ​​структура моего класса Java:

class A { 

@Autowired 
private ClassB classB; 

publiv void methodOne() { 
    methodTwo(); 
} 

private void methodTwo() { 
    ... 
    int returnedValue = classB.someMethod(); 
    ... 
} 
} 

Класс тест приведен ниже:

class ATest { 

@Mock 
private ClassB classB; 

@InjectMocks 
@Autowired 
ClassA classA; 

@Before 
public void setupTest() { 
    MockitoAnnotations.initMocks(this); 
} 

@Test(expected = SomeException.class) 
public void testMethodOne() { 
    when(classB.someMethod()).thenReturn(29); 
    classA.methodOne(); 
} 
} 

Класс тест продолжается от другого, который имеет @RunWith(SpringJUnit4ClassRunner.class) аннотацию.

Я рассмотрел существующие вопросы, но не смог найти ответ. Если есть какие-либо вопросы/ответы, которые могут мне помочь, укажите мне то же самое.

Заранее благодарен!

+0

Не пробовал, но разве класс Test не требует аннотации @RunWith? (например, @RunWith (MockitoJUnitRunner.class)) – hammerfest

+0

Класс тестирования распространяется на другой, который содержит аннотацию RunWith. – user657592

+0

wait, вам нужно либо '@ Runwith', либо руководство' MockitoAnnotations.initMocks (this); ', но никогда не оба! И кстати, как вы знаете, что метод макета никогда не называется? –

ответ

0

Вы можете попытаться удалить @Autowired в свой тестовый класс ATest.

@InjectMocks должно быть достаточно, так как оно создает тестовый объект и вводит ваш макет.

В зависимости от вашего бегуна JUnit @Autowired может выполнить вторую инъекцию после @InjectMocks, которая отменяет настройку вашего издевательства.

+0

Я попытался выполнить тест после удаления @Autowired аннотаций. Но затем я получил ошибку, которая перед использованием @InjectMocks, объект должен быть инициализирован. Итак, я пробовал это: '@InjectMock ClassA classA = new ClassA();' Это вызывает исключение NullPointerException – user657592

0

Во-первых, несколько заметок о тесте: - тест должен быть публичным - класс А должен быть публичным - нет необходимости в @Autowire в тесте - нет необходимости вызывать initMocks

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

public class ClassA { 

    @Autowired 
    private ClassB classB; 

    public int methodOne() { 
     return methodTwo(); 
    } 

    private int methodTwo() { 
     return classB.someMethod(); 
    } 
} 
public class ClassB { 

    public int someMethod() { 
     return 0; 
    } 

} 

Мы можем теперь тест:

@RunWith(MockitoJUnitRunner.class) 
public class ATest { 

    @Mock 
    private ClassB classB; 

    @InjectMocks 
    ClassA classA; 

    @Test 
    public void testMethodOne() { 
     when(classB.someMethod()).thenReturn(29); 
     final int result = classA.methodOne(); 
     assertEquals(29, result); 
    } 
} 

И тест пройдены - то есть издеваться используется правильно.

Надеюсь, что это поможет.

+0

Когда есть другие объекты в ClassA, которые будут автообновлены, это вызовет исключение NullPointerException. – user657592

+0

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

+0

Да - точка должна была иметь простую проверку. Разумеется, вы также можете проверить и выполнить: 'verify (classB) .someMethod();' - который также проходит. – Eugen

0

Что вам не хватает, так это то, что аннотации - это просто объявления. Аннотации @Mock и @InjectMocks ничего не делают. Они представляют собой только маркеры, которые можно увидеть тестировщиком, чтобы выполнить конкретное поведение конкретного бегуна. Вам нужно аннотацию @RunWith, чтобы указать тестовый бегун, но для конкретного поведения вам нужен определенный тестовый бегун. Если вы используете SpringJUnit4ClassRunner, то ни одна из аннотаций Mockito не будет использоваться. В любом случае, я бы не хотел использовать SpringJUnit4ClassRunner для модульных тестов, так как вам нужно просто проверять бизнес-логику, а не проводку.

Измените свой тестовый класс на использование @RunWith (MockitoJUnitRunner.class) и удалите ссылку базового класса.

Смежные вопросы