Glo*_*tor 2 java eclipse junit unit-testing
作为开发人员,我是单元测试的新手,并且需要编写测试用例来对以下代码进行单元测试.有人可以帮助我,并给我一些关于如何在eclipse中编写单元测试的指针.
private void handle(final DocumentEvent e) {
Document doc = e.getDocument();
try {
String text = e.getDocument().getText(0, doc.getLength());
if (text.length() >= maxMessageSize) {
try {
component.getHighlighter()
.addHighlight(maxMessageSize, text.length() + 1, painter);
} catch (BadLocationException ex) {
System.out.println(ex.getMessage());
}
} else {
component.getHighlighter().removeAllHighlights();
}
} catch (BadLocationException e1) {
System.out.println(e1.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢
由于某种原因,当我运行测试用例时,我根本没有得到任何报道.我在这里做错了什么?进一步的研究表明我需要使用test.perform()方法来调用我想要测试的方法.这是正确的吗?你能建议吗?这是代码:
public class TestMaxLength {
static final int maxMessageSize = 125;
JTextPane textPane = new JTextPane();
//***EasyMock varibles****
private JTextComponent mockComponent;
private MaxLength classUnderTest;
private DocumentEvent mockEvent;
private Document mockDocument;
private Highlighter mockHighlighter;
@Before public void setUp() {
mockComponent = EasyMock.createMock(JTextComponent.class);
mockEvent = EasyMock.createMock(DocumentEvent.class);
mockDocument = EasyMock.createMock(Document.class);
EasyMock.expect(mockEvent.getDocument()).andStubReturn(mockDocument);
EasyMock.expect(mockDocument.getLength()).andReturn(256);
mockHighlighter = EasyMock.createMock(Highlighter.class);
EasyMock.expect(mockComponent.getHighlighter()).andReturn(mockHighlighter);
}
@Test public void testSetLength() {
MaxLength maxListener = new MaxLength(125);
maxListener.decorate(textPane);
}
@Test
public void testEmptyText() {
EasyMock.expect(mockDocument.getText(0, 1)).andStubReturn("");
mockHighlighter.removeAllHighlights();
EasyMock.replay(mockComponent, mockEvent, mockDocument, mockHighlighter);
classUnderTest.handle(mockEvent);
EasyMock.verify(mockComponent, mockEvent, mockDocument, mockHighlighter);
}
}
Run Code Online (Sandbox Code Playgroud)
该decorate(JtextComponent jComponent)方法存在于要测试的类(MaxLength)中,定义如下:
public final void decorate(final JTextComponent c) {
//TODO throw exception if already decorating
this.component = c;
component.getDocument().addDocumentListener(this);
}
Run Code Online (Sandbox Code Playgroud)
#
更新:
@Peter:管理发现它不是Component类的问题,而是我需要asm(http://forge.ow2.org/projects/asm).我还更改了代码,将2种方法合并为1种方法:
public void testEmptyText()
{
maxSizeListener.decorate(mockComponent);
//mockHighlighter.removeAllHighlights();
EasyMock.replay(mockComponent, mockEvent, mockDocument, mockHighlighter);
maxSizeListener.handle(mockEvent);
EasyMock.verify(mockComponent, mockEvent, mockDocument, mockHighlighter);
}
Run Code Online (Sandbox Code Playgroud)
但现在我在验证时遇到了不同的错误:
java.lang.AssertionError:
Expectation failure on verify:
getHighlighter(): expected: 1, actual: 0
at org.easymock.internal.MocksControl.verify(MocksControl.java:184)
at org.easymock.EasyMock.verify(EasyMock.java:2038)
at net.TestMaxLength.testEmptyText(TestMaxLength.java:98)
Run Code Online (Sandbox Code Playgroud)
这是在mockComponent上执行EasyMock.verify()语句时引起的.
Pét*_*rök 10
我建议使用模拟框架,例如EasyMock.模拟允许您使用所需的测试行为配置依赖项.在你的情况下,你需要一个模拟DocumentEvent和理想的另一个component,我想这是一个类成员.
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);
}
Run Code Online (Sandbox Code Playgroud)
此测试假设maxMessageSize默认情况下至少为1 - maxMessageSize测试的设置留给您作为练习,因为您发布的代码片段没有提供任何线索.
您显示的方法从与事件关联的文档中获取文本,然后根据其长度,它执行不同的操作.我会写至少以下单元测试:
maxMessageSize == 0maxMessageSize > 0maxMessageSize == text.length()maxMessageSize > text.length()maxMessageSize < text.length()和addHighlight()投掷BadLocationExceptionBadLocationException它有点棘手,因为它产生的是stdout的输出; 幸运的是,您可以通过System.setOut轻松地重新分配stdout .但是,您可能需要考虑改进异常处理,至少使用日志框架而不是打印到stdout.removeAllHighlights()和/或getText())也可以抛出BadLocationException,但是try-catch块没有很好地组织.我会考虑在这些方法抛出时添加更多单元测试,然后重构异常处理代码.我以为我做的事情有问题...请你提供修改/更正的代码吗?
您的testSetLength方法并不是真正测试任何东西 - 您需要断言语句(和/或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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9876 次 |
| 最近记录: |