Я тестирую некоторый код для практики и заметил странную ситуацию.
Существует ChannelRegistry, содержащее все ссылки на каналы связи, и PrimaryConsumer, которому необходимо подключиться к одному из этих каналов, выбранных во время выполнения при вызове initialize ().
Итак, я сделал мой первый тест следующим образом:
@RunWith(MockitoJUnitRunner.class)
public class PrimaryConsumerTest {
private @Mock ChannelsRegistry communicationRegistry;
private PrimaryConsumer consumer;
@Before
public void setup() {
consumer = new PrimaryConsumer(communicationRegistry);
}
@Test
public void shouldAttachToChannel() throws Exception {
consumer.initialize();
verify(communicationRegistry).attachToChannel("channel", consumer);
}
}
Я проверяю, вызывается ли метод присоединения. Чтобы сделать его зеленым, я поставил impl так:
public void initialize() {
communicationRegistry.attachToChannel("channel", this);
}
Теперь следующий тест: получить идентификатор канала по имени и присоединиться к этому конкретному каналу. Я хочу, чтобы мой тест описывал поведение класса, а не его внутренности, поэтому я не хочу, чтобы мой тест был "shouldGetSpecificChannel". Вместо этого я проверяю, может ли он подключиться к каналу, выбранному во время выполнения:
@Test
public void shouldAttachToSpecificChannel() throws Exception {
String channelName = "channel";
when(communicationRegistry.getChannel("channel_name")).thenReturn(channelName);
consumer.initialize();
verify(communicationRegistry).attachToChannel(channelName, consumer);
}
Этот тест проходит немедленно, но реализация завинчена (жестко закодирован "канал").
2 вопроса здесь:
нормально ли иметь 2 теста на такое поведение? Может быть, мне стоит сразу заглушить получение канала в первом тесте? Если да, то как это соотносится с тестированием одной вещи в одном тесте?
как справиться с такой ситуацией: тесты зеленые, импл "жестко закодированные"? Должен ли я написать другой тест с другим названием канала? Если так, я должен удалить это после исправления impl (поскольку это становится бесполезным?)
UPDATE:
Просто некоторые уточнения.
Я жестко запрограммировал «канал» здесь
public void initialize() {
communicationRegistry.attachToChannel("channel", this);
}
только для того, чтобы быстро пройти первый тест. Но затем при запуске второго теста он проходит сразу. Я не проверяю, был ли вызван метод-заглушку, так как думаю, что заглушки не следует проверять явно.
Это то, что вы, Родни, имеете в виду, говоря, что тесты излишни? Если да, то я сделаю заглушку в самом начале первого теста?