今天早上一时兴起,去网上下载下来JMock,EasyMock最新版本来玩玩。用来测试的行为很简单。就是有一个窗体,上面有一个文本框,一个按钮。如果点击按钮,就会把文本框的内容设置为“Hello”。应用MVP模式,这个行为应该在Presenter中,而View接口应该是这样的:
public interface View {
public void setText(String text);
public void addActionListener(ActionListener actionListener);
}
我这里就不TDD了,直接给出Presenter的实现,然后我们来看JMock和EasyMock如何处理这个问题。
public class Presenter {
public Presenter(final View view) {
view.addActionListener(new ActionListener() {
public void actionPerformed() {
view.setText("Hello");
}
});
}
}
好的,我先来写一段伪测试代码:
引用
创建MockView
创建Presenter,传以MockView做为参数
在MockView上触发事件
验证MockView的SetText方法被调用了
然后就用JMock来实现这段伪代码。
@Test
public void test_click_button_should_set_text_hello() {
Mockery mockery = new Mockery();
final View mockView = mockery.mock(View.class);
final ActionListenerMatcher actionListenerMatcher = new ActionListenerMatcher();
mockery.checking(new Expectations() {
{
one(mockView).addActionListener(
with(actionListenerMatcher));
one(mockView).setText("Hello");
}
});
new Presenter(mockView);
actionListenerMatcher.fireActionPerformed();
mockery.assertIsSatisfied();
}
由于JMock没有对触发事件提供直接的支持,所以是自己写了一个ActionListenerMatcher来达到这个目的的。这个Matcher的实现如下:
public class ActionListenerMatcher extends BaseMatcher<ActionListener> {
private ActionListener actionListener;
public boolean matches(Object item) {
actionListener = (ActionListener) item;
return true;
}
public void fireActionPerformed() {
actionListener.actionPerformed();
}
public void describeTo(Description description) {
}
}
可以看到之所以要这个Matcher是因为,我们需要有一个地方来保存Presenter传进来的listener,并且提供一个用来触发事件的方法。
EasyMock的实现与之非常类似,此处不再赘述。代码可以参见附件。
我们可以看到什么?我看到的是,测试时候的Intention(意图)完全掩盖在冗长复杂的代码之中了。如果不用Mock该怎么做?很简单:
@Test
public void test_click_button_should_set_text_hello() {
MockView mockView = new MockView();
new Presenter(mockView);
mockView.fireActionPerformed();
Assert.assertEquals("Hello", mockView.getText());
}
这段代码是不是和上面的伪代码一模一样?MockView是这样的:
private class MockView implements View {
private ActionListener actionListener;
private String text;
public void addActionListener(ActionListener actionListener) {
this.actionListener = actionListener;
}
public void setText(String text) {
this.text = text;
}
public String getText() {
return text;
}
public void fireActionPerformed() {
actionListener.actionPerformed();
}
}
做完这个实验,我不得不说。Mock框架,搞什么搞!简单一点不好么?
分享到:
相关推荐
在Java世界中,Mock框架则是单元测试的重要组成部分,它们帮助开发者模拟复杂的系统交互,以便在隔离环境中测试代码。"基于Java探针的Mock框架"可能是指一种结合了这两种技术的工具,它可能是为了提供更高级别的测试...
Mockcpp是C++编程语言中的一种模拟(mock)框架,用于单元测试。它不依赖于模板来实现其功能,这使得Mockcpp在某些特定场景下,比如对编译时复杂度有严格限制或者对编译速度有较高要求的项目中,成为一个理想的工具...
Moq (pronounced "Mock-you" or just "Mock") is the only mocking library for .NET developed from scratch to take full advantage of .NET 3.5 (i.e. Linq expression trees) and C# 3.0 features (i.e. lambda ...
本文件“用Java编写的最流行的单元测试mock框架.zip”主要包含了关于Mockito的相关资料,帮助开发者更好地理解和使用这个强大的工具。 Mockito是一个开源的Java库,专门设计用于创建模拟对象,以隔离被测试代码并...
mod.dll是一款单元测试模拟框架,常常被用来进行单元测试 [TestMethod] public void Relocation() { var mockContext = new Mock(); mockContext.Setup(c => c.HttpContext.Response.Redirect(...
5. **易于集成**:可以轻松地与现有的测试框架(如Jest、Mocha等)结合,方便进行单元测试和集成测试。 在项目"MockHttpRequest-master"中,可能包含了如下内容: 1. `src`目录:源代码文件,包含mock-xhr库的核心...
本文将深入探讨Mock的概念及其在Struts2与Spring框架中的应用,同时也会涉及到JUnit和EasyMock等单元测试工具。 Mock技术的核心是创建虚拟对象,这些对象的行为可以被精确地控制,从而模拟真实系统中的协作对象。在...
给大家介绍在测试中使用的利器googlemock,它是Google在2008年发布的一套针对C++的Mock框架,与googletest吸取JUnit的精华一样,的它灵感同样来自去Java社区的JMock、EasyMock等Mock思想。 更多关于google...
Swift-CuckooSwiftKit 是一个针对Swift开发的测试框架,其特点是无需编写额外的模拟(mock)代码,就能实现测试的高效与灵活。Cuckoo框架利用编译时的元编程技术,在目标代码中动态插入结构体和类,使得在运行时能够...
本文来自于51cto,文章主要讲解Mock框架三个版本的实现方法和优缺点以及单元测试展开方式等相关内容。对于单元测试中的单元,不同的人有不同的看法:可以理解为一个方法,可以理解为一个完整的接口实现,也可以理解...
Google Mock(通常称为gmock)是Google Test框架的一部分,专门用于创建和使用模拟对象,以便在测试中隔离被测试代码,确保其独立于其他组件进行评估。下面,我们将深入探讨这两个重要的测试工具及其应用。 **...
`Mock<T>` 是MoQ框架的核心类,用于创建和管理模拟对象。`T`代表你要模拟的接口或抽象类。例如,你可以通过`new Mock()`创建一个`ITest`接口的模拟对象。 2. **方法模拟**: 你可以使用`Setup`方法来定义模拟对象...
- GoMock可以与标准库`testing`无缝集成,也可以配合其他第三方测试框架如`go-testdeep`,增强测试能力。 5. **实际应用示例** - 在服务间的依赖模拟:如果你的代码依赖于外部服务,可以通过GoMock模拟这些服务...
Classes contained in spring-mock.jar: org.springframework.mock.jndi.ExpectedLookupTemplate.class org.springframework.mock.jndi.SimpleNamingContext.class org.springframework.mock.jndi....
Mock技术在软件开发中扮演着重要的角色,尤其是在测试领域。它允许开发者在不依赖实际环境或第三方服务的情况下,创建模拟对象来代替真实组件,以便进行单元测试和集成测试。这样可以提高测试效率,减少测试复杂性,...
MockServer 是一个强大的工具,主要用于在开发过程中模拟服务器行为,特别是在接口开发和测试阶段。它允许开发者在没有实际后端服务的情况下,创建模拟的HTTP和HTTPS服务器,以便于快速验证前端代码或者自动化测试。...
Python 提供了一个强大的库——`unittest.mock`,用于模拟(mock)对象、方法和类,以便在测试中隔离依赖关系,专注于测试目标代码的功能。本练习主要关注如何使用 `unittest.mock` 进行mock测试数据。 一、Mock...
Google Mock 是一个强大的 C++ 单元测试框架,它允许开发者创建模拟对象(Mock Objects)以测试复杂的系统中各个组件的交互。Mock 对象能够模拟真实对象的行为,并且可以预设它们在特定调用下的响应,这对于隔离测试...