`
taowen
  • 浏览: 193328 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mock框架搞什么搞?

阅读更多
今天早上一时兴起,去网上下载下来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框架,搞什么搞!简单一点不好么?
分享到:
评论
3 楼 raimundox 2007-05-11  
你给的例子不是Mock,至多是Fake。各种区别见马大叔的Mocks Aren't Stubs:

* Dummy objects are passed around but never actually used. Usually they are just used to fill parameter lists.
* Fake objects actually have working implementations, but usually take some shortcut which makes them not suitable for production (an in memory database is a good example).
* Stubs provide canned answers to calls made during the test, usually not responding at all to anything outside what's programmed in for the test. Stubs may also record information about calls, such as an email gateway stub that remembers the messages it 'sent', or maybe only how many messages it 'sent'.
* Mocks are what we are talking about here: objects pre-programmed with expectations which form a specification of the calls they are expected to receive.

因此实际上,不是JMock或EasyMock框架复杂,而是你给的例子中,Mock不是最佳选择,如果View里东西再多一点,Fake可能就不太合适了。
2 楼 taowen 2007-05-11  
简单问题是怎么被mock框架搞复杂的,这个例子难道还不明白吗?静态构造函数,泛型。构造出奇技淫巧的语法。结果缺并没有把事情搞简单。这还不能够说明问题?
1 楼 dustinth 2007-05-11  
搞明白哪些地方可以使用Mock先再骂娘, OK?

相关推荐

    基于Java探针的Mock框架.zip

    在Java世界中,Mock框架则是单元测试的重要组成部分,它们帮助开发者模拟复杂的系统交互,以便在隔离环境中测试代码。"基于Java探针的Mock框架"可能是指一种结合了这两种技术的工具,它可能是为了提供更高级别的测试...

    C++ mock框架mockcpp

    Mockcpp是C++编程语言中的一种模拟(mock)框架,用于单元测试。它不依赖于模板来实现其功能,这使得Mockcpp在某些特定场景下,比如对编译时复杂度有严格限制或者对编译速度有较高要求的项目中,成为一个理想的工具...

    [Mock框架] Moq 4.0.10827

    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

    本文件“用Java编写的最流行的单元测试mock框架.zip”主要包含了关于Mockito的相关资料,帮助开发者更好地理解和使用这个强大的工具。 Mockito是一个开源的Java库,专门设计用于创建模拟对象,以隔离被测试代码并...

    mock框架插件 mod.dll

    mod.dll是一款单元测试模拟框架,常常被用来进行单元测试 [TestMethod] public void Relocation() { var mockContext = new Mock(); mockContext.Setup(c =&gt; c.HttpContext.Response.Redirect(...

    前端开源库-mock-xhr

    5. **易于集成**:可以轻松地与现有的测试框架(如Jest、Mocha等)结合,方便进行单元测试和集成测试。 在项目"MockHttpRequest-master"中,可能包含了如下内容: 1. `src`目录:源代码文件,包含mock-xhr库的核心...

    mock

    本文将深入探讨Mock的概念及其在Struts2与Spring框架中的应用,同时也会涉及到JUnit和EasyMock等单元测试工具。 Mock技术的核心是创建虚拟对象,这些对象的行为可以被精确地控制,从而模拟真实系统中的协作对象。在...

    Google C++ Mock框架 googlemock使用介绍

     给大家介绍在测试中使用的利器googlemock,它是Google在2008年发布的一套针对C++的Mock框架,与googletest吸取JUnit的精华一样,的它灵感同样来自去Java社区的JMock、EasyMock等Mock思想。  更多关于google...

    swift-CuckooSwiftKit第一个无板样代码的测试用mock框架

    Swift-CuckooSwiftKit 是一个针对Swift开发的测试框架,其特点是无需编写额外的模拟(mock)代码,就能实现测试的高效与灵活。Cuckoo框架利用编译时的元编程技术,在目标代码中动态插入结构体和类,使得在运行时能够...

    Mock框架的三次迭代,让你的单元测试更高效

    本文来自于51cto,文章主要讲解Mock框架三个版本的实现方法和优缺点以及单元测试展开方式等相关内容。对于单元测试中的单元,不同的人有不同的看法:可以理解为一个方法,可以理解为一个完整的接口实现,也可以理解...

    google c++ testing 框架 google mock 资料搜集

    Google Mock(通常称为gmock)是Google Test框架的一部分,专门用于创建和使用模拟对象,以便在测试中隔离被测试代码,确保其独立于其他组件进行评估。下面,我们将深入探讨这两个重要的测试工具及其应用。 **...

    MoQ(基于.net3.5,c_3.0的mock框架)简单介绍

    `Mock&lt;T&gt;` 是MoQ框架的核心类,用于创建和管理模拟对象。`T`代表你要模拟的接口或抽象类。例如,你可以通过`new Mock()`创建一个`ITest`接口的模拟对象。 2. **方法模拟**: 你可以使用`Setup`方法来定义模拟对象...

    Go-GoMock是Go编程语言的一个模拟框架

    - GoMock可以与标准库`testing`无缝集成,也可以配合其他第三方测试框架如`go-testdeep`,增强测试能力。 5. **实际应用示例** - 在服务间的依赖模拟:如果你的代码依赖于外部服务,可以通过GoMock模拟这些服务...

    Mock

    Mock技术在软件开发中扮演着重要的角色,尤其是在测试领域。它允许开发者在不依赖实际环境或第三方服务的情况下,创建模拟对象来代替真实组件,以便进行单元测试和集成测试。这样可以提高测试效率,减少测试复杂性,...

    mockServer,mock服务端

    MockServer 是一个强大的工具,主要用于在开发过程中模拟服务器行为,特别是在接口开发和测试阶段。它允许开发者在没有实际后端服务的情况下,创建模拟的HTTP和HTTPS服务器,以便于快速验证前端代码或者自动化测试。...

    spring-mock.jar

    Classes contained in spring-mock.jar: org.springframework.mock.jndi.ExpectedLookupTemplate.class org.springframework.mock.jndi.SimpleNamingContext.class org.springframework.mock.jndi....

    基于python的mock测试数据练习

    Python 提供了一个强大的库——`unittest.mock`,用于模拟(mock)对象、方法和类,以便在测试中隔离依赖关系,专注于测试目标代码的功能。本练习主要关注如何使用 `unittest.mock` 进行mock测试数据。 一、Mock...

    转:google mock C++单元测试框架-奋飞的菜鸟-ChinaUnix博客1

    Google Mock 是一个强大的 C++ 单元测试框架,它允许开发者创建模拟对象(Mock Objects)以测试复杂的系统中各个组件的交互。Mock 对象能够模拟真实对象的行为,并且可以预设它们在特定调用下的响应,这对于隔离测试...

Global site tag (gtag.js) - Google Analytics