#junit #mockito #junit5 #junit5-extension-model
#junit #mockito #junit5 #junit5-extension-model
Вопрос:
У меня есть абстрактный класс с таким количеством методов с бизнес-логикой. При написании Junits я тестирую абстрактный класс, создавая его макет с вызовами реальных методов. В моем Junit я не хочу создавать конкретный класс для тестирования метода абстрактного класса, потому что тогда мой тестовый пример Junit получит поведение, которого я не хочу.
Я использую это для создания макета для вызова моего абстрактного класса. Mockito.mock(AbstractService.class,Mockito.CALLS_REAL_METHODS)
Но моя проблема в том, что мой абстрактный класс имеет так много зависимостей, которые автоматически подключаются. Дочерние классы @component
. Теперь, если бы это был не абстрактный класс, я бы использовал @InjectMocks, чтобы внедрить эти фиктивные зависимости. Но как добавить макет к этому экземпляру, я описал выше.
Упрощает версию кода здесь/
abstract class AbstractService{
@Autowired
DependencyOne dp1;
@Autowired
private DependencyOne dp2;
public void doSometingSpecial(){
dp1.Dosomething(dp2.dosomethingElse())
.....
.....
}
}
Мой Junit
@ExtendWith(SpringExtension.class)
@TestInstance(Lifecycle.PER_CLASS)
class AbstractServiceTest {
@Mock
private DependencyOne dp1;
@Mock
private DependencyOne dp2;
.....
.....
@Test
void testDirectCall_whenSomething_thenSomerhing(){
AbstractService service = Mockito.mock(AbstractService.class,Mockito.CALLS_REAL_METHODS);
//How to inject dep1 and dp2 mock to write junit for doSometingSpecial()
}
}
Ответ №1:
просто добавьте inject mock только для родительского класса
@InjectMocks
AbstractService abstractService;
Внутренний метод тестирования дает,
@Test
void testDirectCall_whenSomething_thenSomerhing(){
when(myAbstractClass.doSometingSpecial()).thenReturn("good");
Assert.assertEquals("good",myAbstractClass.doSometingSpecial());
}
Нет необходимости
AbstractService service = Mockito.mock(AbstractService.class,Mockito.CALLS_REAL_METHODS);
в разделе импорт, пожалуйста, добавьте
import static org.mockito.Mockito.*;
Комментарии:
1. Как я уже сказал, это не сработает.. Мне нужно протестировать абстрактный класс…. то, что вы сделали, было издевательством над самим тестовым целевым классом……. Я издеваюсь над ним, поскольку он абстрактен, поэтому не могу создать экземпляр……. Мне нужно, чтобы иметь возможность вызывать методы внутри этого class…so CALLS_REAL_METHODS необходимо передавать в качестве аргумента во время насмешки…