首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何开始测试(JMock)

如何开始测试(JMock)
EN

Stack Overflow用户
提问于 2010-05-25 13:41:47
回答 4查看 19.5K关注 0票数 7

我在努力学习如何写测试。我还在学习Java,有人告诉我应该学习/使用/实践jMock,我在网上找到了一些文章,这些文章在一定程度上起到了帮助作用,比如:

http://www.theserverside.com/news/1365050/Using-JMock-in-Test-Driven-Development

http://jeantessier.com/SoftwareEngineering/Mocking.html#jMock

我发现的大多数文章都是关于测试驱动开发的,首先编写测试,然后编写代码使测试通过。目前,我并不是在寻找这个问题,而是尝试用jMock来编写已经存在的代码的测试。

至少可以说,正式文件含糊不清,对我来说太难了。有没有人有更好的方法来学习这个。好的书/链接/教程会对我有很大帮助。谢谢

编辑-更具体的问题:

http://jeantessier.com/SoftwareEngineering/Mocking.html#jMock -来自本文

尝试过这样做来模拟这个简单的类:

代码语言:javascript
复制
import java.util.Map;
    public class Cache {
        private Map<Integer, String> underlyingStorage;
        public Cache(Map<Integer, String> underlyingStorage) {
            this.underlyingStorage = underlyingStorage;
        }
        public String get(int key) {
            return underlyingStorage.get(key);
        }
        public void add(int key, String value) {
            underlyingStorage.put(key, value);
        }
        public void remove(int key) {
            underlyingStorage.remove(key);
        }
        public int size() {
            return underlyingStorage.size();
        }
        public void clear() {
            underlyingStorage.clear();
        }
    }

下面是我如何尝试创建一个测试/模拟:

代码语言:javascript
复制
public class CacheTest extends TestCase {

    private Mockery context;
    private Map mockMap;
    private Cache cache;

    @Override
    @Before
    public void setUp() {
        context = new Mockery() {
            {
                setImposteriser(ClassImposteriser.INSTANCE);
            }
        };

        mockMap = context.mock(Map.class);
        cache = new Cache(mockMap);
    }

    public void testCache() {
        context.checking(new Expectations() {{
            atLeast(1).of(mockMap).size(); 
            will(returnValue(int.class));
        }});

    }
}

它通过了测试,基本上什么也不做,我想要的是创建一个地图并检查它的大小,你知道,有些变体试图控制住它。了解更好的例子,我还能在这里测试什么或者任何其他的练习对我有很大的帮助。tnx

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-25 14:35:36

下面是关于使用JUnit和EasyMock的教程(我个人认为这是一个比JMock更容易使用的模拟库):http://www.michaelminella.com/testing/unit-testing-with-junit-and-easymock.html

即使您100%地致力于使用JMock,两者之间的概念是相同的,这将帮助您更好地理解它们。

嘲笑的目的是,当您测试类A (它依赖于BC )时,您的A测试使用BC的模拟版本来指定它们的确切行为,而不是在A测试中使用BC的真正实现。否则,您不仅测试A的单个单元,还隐式地测试BC

票数 6
EN

Stack Overflow用户

发布于 2010-05-27 07:34:04

作为JMock的作者,我不会从这个技术开始,除非您有一些使用TDD的经验。先从基础开始,然后让它发挥作用。一旦你开始经历与规模和发展一个设计的困难,回到技术。

Dave的书仍然是一个很好的介绍,也是唯一一个,我认为,这一代人解释得很好的嘲弄。在那之后,你可以考虑我们的,“成长的面向对象的软件,由测试指导”

如果有人告诉你,这一切都是为了让针对文件系统的测试更快一些,那就给它打折扣吧。

票数 3
EN

Stack Overflow用户

发布于 2010-05-25 18:16:56

您不需要真正的模拟来测试这个类,因为它唯一的协作者是一个Map,您可以像现在一样使用它。而且,您的类实际上没有做任何事情(除了委托),这就是为什么您觉得自己没有进行太多的测试。

直接测试可能是(我假设您使用的是JUnit 4 --您的代码是JUnit 3和4的奇怪混合体)

代码语言:javascript
复制
@Test
public void sizeIs0WhenEmpty()
{
  Map<Integer, String> map = Collections.emptyMap();
  Cache cache = new Cache(map)
  assertEquals(0, cache.size());
}

如果是模拟代码(假设模拟代码是正确的--我不使用JMock)

代码语言:javascript
复制
@Test
public void sizeIs0WhenEmpty()
{
  context.checking(new Expectations() {{
                   atLeast(1).of(mockMap).size(); 
                   will(returnValue(0));
                   }});
  assertEquals(0, cache.size());
}

在这两种情况下,通过将映射设置为具有要测试的属性,然后检查缓存是否具有相同的属性(因为它是直接委托的)来设置系统。

我建议您在继续之前阅读关于JUnit

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2905157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档