Как проверить контрольные примеры, если проверка невозможна - PullRequest
1 голос
/ 15 мая 2019

Я изучаю модульное тестирование, и я столкнулся с проблемой создания окончательной проверки, является ли тестовый пример правильным или нет. Обычно я пытаюсь создать подтверждение, например, через assertEquals(). Но что делать, если это невозможно проверить таким образом?

У меня есть такой класс:

public class Landlord {

    private Map<String, ChannelHandlerContext> currentOccupier;
    private static Landlord instance;

    public Landlord() {
        currentOccupier = new HashMap<>();
    }

    public static Landlord getInstance {
        //return instance
    }

    public void add(Occupier occupier){
        currentOccupier.put("test", occupier.getChannelHandlerContext());    
    }
}

А теперь я пытаюсь проверить метод следующим образом:

public class LandlordTest {

    private Landlord landlord;
    @Mock
    private Occupier occupier;
    @Mock
    private ChannelHandlerContext channelHandlerContext;


    @BeforeEach
    void setUp() {
        occupier = mock(Occupier.class);
        channelHandlerContext = mock(ChannelHandlerContext.class);

        landlord = Landlord.getInstance();

        when(occupier.getChannelHandlerContext()).thenReturn(channelHandlerContext);
    }

    public void add(Occupier occupier){
        addedOccupier.put(occupier.getChannelHandlerContext()); 
        //adding succeded
    }

}

Может быть, в этом коротком примере его не нужно будет проверять, но есть ли способ проверить, что метод add был успешным? Обычно в таких случаях я бы попробовал что-то вроде: assertEquals(currentOccupier.size(), 1), но здесь я не могу получить доступ к hashMap экземпляра, чтобы сделать это следующим образом. Есть ли другой способ проверить правильность поведения при его добавлении?

1 Ответ

0 голосов
/ 15 мая 2019

Этого assertEquals(currentOccupier.size(), 1) действительно недостаточно.
Вы хотите утверждать, что карта содержит запись, которую вы добавили в карту.
Это утверждение слишком поверхностно: оно не проверяет для ввода ни значение ключа, ни значение значения.
Вы должны сделать что-то вроде:

ChannelHandlerContext actualContext = landLord.get("test");
assertSame(addedContext, actualContext);
// or assertEquals if the instances may differ because you do some defensive copy in add()

Также обратите внимание, что здесь вы дразните некоторые вещи, которые не должны быть высмеяны: occupier и channelHandlerContext составляют часть вашей модели. Вы должны быть в состоянии предоставить «нормальные» экземпляры их в рамках теста.

Здесь у вас есть два основных способа сделать это:

1) добавление публичного метода в тестируемый класс для поиска ChannelHandlerContext:

public ChannelHandlerContext get(String name){
    currentOccupier.get(name);    
}

Делайте это только , если предоставление такого доступа приемлемо.
Если вы не можете добавить общедоступный метод, добавьте метод уровня пакета, так как он не является частью открытого API.

2) использовать api отражения (в основном Class.getDeclaredField(String) и Field.get()), чтобы извлечь экземпляр карты из тестируемого экземпляра, а затем утверждать, что он содержит ожидаемый экземпляр ChannelHandlerContext для ключа "test".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...