java 如何开始测试(jMock)

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2905157/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-29 23:22:05  来源:igfitidea点击:

How to get started with testing(jMock)

javaunit-testingtestingmockingjmock

提问by London

I'm trying to learn how to write tests. I'm also learning Java, I was told I should learn/use/practice jMock, I've found some articles online that help to certain extend like :

我正在尝试学习如何编写测试。我也在学习 Java,有人告诉我我应该学习/使用/实践 jMock,我在网上找到了一些有助于某些扩展的文章,例如:

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

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

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

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

And most articles I found was about test driven development, write tests first then write code to make the test pass. I'm not looking for that at the moment, I'm trying to write tests for already existing code with jMock.

我发现的大多数文章都是关于测试驱动开发的,首先编写测试然后编写代码以使测试通过。我现在不是在寻找那个,我正在尝试使用 jMock 为已经存在的代码编写测试。

The official documentationis vague to say the least and just too hard for me. Does anybody have better way to learn this. Good books/links/tutorials would help me a lot. thank you

官方文档是模糊最小,实在太难说了我。有没有人有更好的方法来学习这个。好书/链接/教程会对我有很大帮助。谢谢

EDIT - more concrete question :

编辑 - 更具体的问题:

http://jeantessier.com/SoftwareEngineering/Mocking.html#jMock- from this article

http://jeantessier.com/SoftwareEngineering/Mocking.html#jMock- 来自这篇文章

Tried this to mock this simple class :

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

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();
        }
    }

Here is how I tried to create a test/mock :

这是我尝试创建测试/模拟的方式:

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));
        }});

    }
}

It passes the test and basically does nothing, what I wanted is to create a map and check its size, and you know work some variations try to get a grip on this. Understand better trough examples, what else could I test here or any other exercises would help me a lot. tnx

它通过了测试并且基本上什么都不做,我想要的是创建一个地图并检查它的大小,你知道工作一些变化试图抓住这个。通过示例更好地理解,我还可以在这里测试什么或任何其他练习对我有很大帮助。tnx

采纳答案by matt b

Here is a tutorial about using JUnit and EasyMock (a mocking library I personally find far easier to use than JMock): http://www.michaelminella.com/testing/unit-testing-with-junit-and-easymock.html

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

Even if you are 100% dedicated to using JMock, the concepts between the two are the same and this should help you understand them better.

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

The purpose of mocking is that when you test Class A, which depends on Band C, your test of Auses mock versions of Band Cto be able to specify their exact behavior rather than using the real implementations of Band Cin your test of A. Otherwise you are not testing just the single unit of A, you are implicitly testing Band Cas well.

嘲讽的目的是,当你的测试类A,这取决于BC,你的测试A使用的模拟版本B,并C能够指定他们的具体行为,而不是使用真正的实现BC在你的测试A。否则,你是不是测试只是单一的单元A,你是隐式测试B,并C为好。

回答by Steve Freeman

As an author of JMock, I wouldn't start with the technique until you have some experience with TDD. Just start with the basics and get it working. Once you start to experience difficulties with scale and growing a design, come back to the technique.

作为 JMock 的作者,在您对 TDD 有一些经验之前,我不会开始使用该技术。只需从基础开始,让它工作。一旦您开始遇到规模和设计发展方面的困难,请回到技术上来。

The Dave Astels book is still a good introduction and the only one, I think, of that generation that explained mocks well. After that, you might (ahem) consider ours, "Growing Object Oriented Software, Guided by Tests"

戴夫·阿斯特尔斯 (Dave Astels) 的书仍然是很好的介绍,而且我认为是那一代人中唯一一本很好地解释了嘲笑的书。在那之后,您可能会(咳咳)考虑我们的“以测试为指导的面向对象软件的发展”

Discount anyone who tells you it's all about making tests against the file system go faster.

任何告诉你这一切都是为了让针对文件系统的测试变得更快的人,打折。

回答by Kathy Van Stone

You don't need really mock to test this class as its only collaborator is a Map which you might as well just use as is. Also your class doesn't really do anything (except delegate) which is why you feel like you are not testing much.

你不需要真的模拟来测试这个类,因为它唯一的合作者是一个 Map,你可以直接使用它。此外,您的班级并没有真正做任何事情(委托除外),这就是为什么您觉得自己没有进行太多测试。

A straight test might be (I'm assuming you are using JUnit 4 -- your code is an odd mixture of JUnit 3 and 4

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

@Test
public void sizeIs0WhenEmpty()
{
  Map<Integer, String> map = Collections.emptyMap();
  Cache cache = new Cache(map)
  assertEquals(0, cache.size());
}

with mocks it would be (assuming the mock code is correct -- I don't use JMock)

模拟它会是(假设模拟代码是正确的——我不使用 JMock)

@Test
public void sizeIs0WhenEmpty()
{
  context.checking(new Expectations() {{
                   atLeast(1).of(mockMap).size(); 
                   will(returnValue(0));
                   }});
  assertEquals(0, cache.size());
}

In both cases you setup the system by setting the map to have the properties you want to test and then check that the cache has the same properties (as it is a straight delegate).

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

I would recommend you read about JUnitbefore you continue.

我建议您在继续之前阅读有关 JUnit 的信息

回答by Rob Heiser

I don't know how far you've gone down the path to learning about using mock objects in testing, so I'll write a brief description then point you in the direction of an article that may be helpful to you. Mock objects are used in unit testing to replace external dependencies that are difficult to create or difficult to get into the state you want them for your test. The various mocking frameworks that exist give you mechanisms to create "fake" objects that take the place of these dependencies. These mock objects will keep track of calls coming into them from your code and allow you to make assertions about these interactions later. There's a well known article about mock objects and how they relate to "stubs", another common testing strategy for simplifying external dependencies. It was written by Martin Fowler and can be found here:

我不知道您在学习如何在测试中使用模拟对象的道路上走了多远,所以我会写一个简短的描述,然后为您指明一篇可能对您有帮助的文章的方向。Mock 对象在单元测试中用于替换难以创建或难以进入测试状态的外部依赖项。现有的各种模拟框架为您提供了创建替代这些依赖项的“假”对象的机制。这些模拟对象将跟踪从您的代码进入它们的调用,并允许您稍后对这些交互进行断言。有一篇关于模拟对象以及它们与“存根”的关系的著名文章,“存根”是另一种简化外部依赖项的常见测试策略。

http://martinfowler.com/articles/mocksArentStubs.html

http://martinfowler.com/articles/mocksArentStubs.html