Если вы пишете набор тестов для класса, то для кода установки некоторых ваших тестов можно использовать методы этого класса. Фактически, избежать этого практически невозможно.
Если вы хотите, чтобы ваши тесты были всеобъемлющими, вам нужно протестировать конструктор вашего класса . Но, конечно, все тесты методов вашего класса должны сначала создать объект вашего класса, как часть их фазы установки.
public ThingTest // We have a class named Thing we want to test, this is its unit tests
{
@Test
public void testIncrement() // Test of the Thing.increment method
{
// Set up:
var thing = new Thing(); // Using part of the Thing class in the set up phase!
// Exercise:
thing.increment();
// Verify:
assertEquals(1, thing.count());
}
...
Вы обеспокоены, я полагаю, потому что вы хотитеваши тесты должны быть расположены так, чтобы ошибка в тестируемом коде приводила только к одному провалу теста, поэтому отладка теста не представляет труда. Это идеал, к которому стоит стремиться, но это всего лишь идеал. На практике некоторые виды ошибок и тестов не могут быть такими простыми.
Вы можете уменьшить эту трудность, обеспечив комплексные тесты и тестирование снизу вверх. То есть, если этап настройки теста основан на корректной работе определенного мутатора или конструктора, вы должны иметь модульные тесты этого мутатора или конструктора.
Для сложного кода вы можете рассмотреть возможность использования уровня Java assert
утверждения (мои предпочтения) или предположения JUnit , чтобы проверить, что фаза настройки теста завершена правильно, прежде чем приступить к выполнению тестируемого вами метода. Тогда вместо трудной отладки неудачного теста вы получите AssertionError
или AssumptionViolatedException
или TestAbortedException
, который более четко указывает напричина проблемы.
@Test
public void testIncrement()
{
var thing = new Thing();
assert thing.count() == 0;
thing.increment();
// Verify:
assertEquals(1, thing.count());
}
...