В моем проекте javaee есть интерфейс:
public interface SomeInterface{...}
и несколько реализаций:
@Stateless(name = "ImplementationA")
public class ImplementationA implements SomeInterface{...}
@Stateless(name = "ImplementationB")
public class ImplementationB implements SomeInterface{...}
Чтобы получить доступ ко всем реализациям, у меня есть следующее в другом классе:
@Singelton
public class AnotherClass{
@Inject
@Any
private Instance<SomeInterface> impls;
public SomeInterface someMethod(){
for(SomeInterface imp : impls){
if(imp.oneMethod()){
return imp;
}
}
return null;
}
}
Если я хочу выполнить модульный тест для этого «AnotherClass», как мне издеваться над
Instance<SomeInterface> impls
поле?
Пробовал @Mock, @Spy, не смог правильно высмеять «имплы» из Mockito, когда тест запускается, «имплы» всегда равны нулю.
Сам модульный тест выглядит следующим образом:
@RunWith(MockitoJUnitRunner.class)
public class SomeTestClass {
@InjectMocks
AnotherClass anotherClass;
@Spy // Here I tried @Mock as well
private Instance<SomeInterface> impls;
@Test
public void TestSomeMethod(){
Assert.assertTrue( anotherClass.someMethod() == null ); // <- NullPointerException here, which indicates the impls is null instead of anotherClass.
}
}
Пришлось добавить еще один метод в этот «AnotherClass», чтобы принять экземпляр Instance impls, созданный в модульном тесте, который работает, но уродлив, потому что другой нерелевантный метод должен быть добавлен только для целей модульного теста.
Любая идея, как выглядит правильный способ выполнения модульного теста?
Версия Mockito и Junit:
group: 'junit', name: 'junit', version: '4.12'
group: 'org.mockito', name: 'mockito-core', version:'2.12.0'
Заранее спасибо.
xxxx()
. он недействителен? - person ikos23   schedule 29.05.2018