Я рекомендую использовать фреймворк , например EasyMock .Mocks позволяют вам настроить зависимости с желаемым поведением для ваших тестов.В вашем случае вам нужен макет DocumentEvent
и в идеале еще один для component
, который, я думаю, является членом класса.
Два аспекта модульного тестирования
- как проверить, т. Е.технические детали сборки правильного набора объектов в нужном состоянии, необходимые для правильной работы теста (он же прибор _test), и
- что проверить, то есть сценарии для проверки.
Как тестировать
Eclipse поддерживает JUnit из коробки, поэтому вы можете быстро генерировать новые тестовые случаи JUnit (в контекстном меню Project Explorer: New -> (Other ->)JUnit -> JUnit Test Case), затем запустите его, нажав кнопку Run.
Настройка тестового прибора в вашем случае будет выглядеть примерно так, используя EasyMock (и при условии, что вы можете передать компонент какпараметр конструктора для вашего тестируемого класса):
private Component mockComponent;
private ClassUnderTest classUnderTest;
private DocumentEvent mockEvent;
private Document mockDocument;
private Highlighter mockHighlighter;
@Before
public void setUp() {
mockComponent = createMock(Component.class);
classUnderTest = new ClassUnderTest(mockComponent);
mockEvent = createMock(DocumentEvent.class);
mockDocument = createMock(Document.class);
expect(mockEvent.getDocument()).andStubReturn(mockDocument);
expect(mockDocument.getLength()).andReturn(1);
mockHighlighter = createMock(Highlighter.class);
expect(mockComponent.getHighlighter()).andReturn(mockHighlighter);
}
@Test
public void testEmptyText() {
expect(mockDocument.getText(0, 1)).andStubReturn("");
mockHighlighter.removeAllHighlights();
replay(mockComponent, mockEvent, mockDocument, mockHighlighter);
classUnderTest.handle(mockEvent);
verify(mockComponent, mockEvent, mockDocument, mockHighlighter);
}
В этом тесте предполагается, что maxMessageSize
по крайней мере равен 1 по умолчанию - установка maxMessageSize
up для теста оставлена вам в качестве упражнения в качестве фрагмента кодаВы опубликовали, не дает подсказки для этого.
Что тестировать
Метод, который вы показываете, получает текст из документа, связанного с событием, а затем на основе его длины, он делаетразные вещи.Я бы написал для этого как минимум следующие юнит-тесты:
- пустой текст документа с
maxMessageSize == 0
- пустой текст документа с
maxMessageSize > 0
- непустой текст документас
maxMessageSize == text.length()
- непустым текстом документа с
maxMessageSize > text.length()
- непустым текстом документа с
maxMessageSize < text.length()
и addHighlight()
выбрасыванием BadLocationException
Примечания
- воспринимать
BadLocationException
немного сложно, поскольку все, что он производит, это вывод в stdout;К счастью, вы можете легко переназначить стандартный вывод через System.setOut .Тем не менее, вы можете рассмотреть возможность улучшения обработки исключений, по крайней мере, с помощью каркаса ведения журнала вместо печати в стандартный вывод. - из кода кажется, что другие методы (такие как
removeAllHighlights()
и / или getText()
) также может выдавать BadLocationException
, однако блоки try-catch
не очень хорошо организованы.Я хотел бы рассмотреть возможность добавления дополнительных модульных тестов, где эти методы выдают, и после этого рефакторинг кода обработки исключений.
Обновление
Я думал, что что-то не так, что я былделать ... Можете ли вы предоставить мне измененный / исправленный код, пожалуйста ???
Ваш testSetLength
метод на самом деле ничего не тестирует - вам нужны операторы assert (и / или проверка EasyMock)для того, чтобы ваши юнит-тесты действительно проверяли какое-то поведение.Тем не менее, он предоставляет недостающую подсказку для настройки тестируемого класса.Поэтому я пытаюсь объединить два ваших метода тестирования, чтобы создать один, который, надеюсь, работает (я пишу по памяти, поэтому не могу гарантировать, что он все скомпилируется и будет отлично работать с первой попытки):
@Test
public void testEmptyText() {
// set up the test class with a specific max length
classUnderTest = new MaxLength(125);
// this shall be called from inside decorate()
mockDocument.addDocumentListener(classUnderTest);
// the mock document shall always return an empty text
EasyMock.expect(mockDocument.getText(0, 1)).andStubReturn("");
// we expect this to be called from inside handle()
mockHighlighter.removeAllHighlights();
// start replay mode
EasyMock.replay(mockComponent, mockEvent, mockDocument, mockHighlighter);
// inject mock component into tested object
maxListener.decorate(mockComponent);
// call the tested method
classUnderTest.handle(mockEvent);
// verify that all expected calls to the mocks have been made
EasyMock.verify(mockComponent, mockEvent, mockDocument, mockHighlighter);
}