Часто используемый подход состоит в том, чтобы установить фиктивную DocumentConfig
и внедрить ее в метод setUp()
(аннотированный @Before
), чтобы весь контекст сбрасывался в каждом тесте, например:
@Before
public void setUp() {
this.documentConfig = new DocumentConfig();
this.documentConfig.setNameRequired(false);
this.service = new DocumentService(this.documentConfig);
}
В этом случае я настроил простой объект с nameRequired
, равным false
. Я мог бы, вероятно, удалить этот оператор, потому что поле boolean
по умолчанию равно false
.
Если вы не используете инжекцию конструктора и у вас нет установщика для documentConfig
, вам придется использовать отражение, чтобы ввести поле, например:
ReflectionTestUtils.setField(this.service, "documentConfig", this.documentConfig);
В вашем тесте вы можете написать что-то вроде этого:
@Test
public void save_failure() {
this.documentConfig.setNameRequired(true);
// TODO: Implement test
}
В качестве альтернативы, вы можете издеваться над DocumentConfig
, чтобы вы не полагались на его реализацию для тестирования DocumentService
. Я предполагаю, что вы звоните isNameRequired()
где-то в коде DocumentService
, так что вы можете посмеяться над этим так:
@Before
public void setUp() {
// Use a static import for Mockito.mock()
this.documentConfig = mock(DocumentConfig.class);
this.service = new DocumentService(this.documentConfig);
}
@Test
public void save_failure() {
// Use a static import for Mockito.when()
when(this.documentConfig.isNameRequired()).thenReturn(true);
// TODO: Implement test
}
Так как эта установка для насмешек / инъекций происходит довольно часто, у Mockito также есть собственный бегун, который позволяет избавиться от метода setUp()
, например:
@RunWith(MockitoJUnitRunner.class)
public class DocumentServiceTest {
@InjectMocks
private DocumentService documentService;
@Mock
private DocumentConfig documentConfig;
@Test
public void save_failure() {
when(this.documentConfig.isNameRequired()).thenReturn(true);
// TODO: Implement test
}
}