我在努力学习如何写测试。我还在学习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 -来自本文
尝试过这样做来模拟这个简单的类:
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();
}
}下面是我如何尝试创建一个测试/模拟:
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
发布于 2010-05-25 14:35:36
下面是关于使用JUnit和EasyMock的教程(我个人认为这是一个比JMock更容易使用的模拟库):http://www.michaelminella.com/testing/unit-testing-with-junit-and-easymock.html
即使您100%地致力于使用JMock,两者之间的概念是相同的,这将帮助您更好地理解它们。
嘲笑的目的是,当您测试类A (它依赖于B和C )时,您的A测试使用B和C的模拟版本来指定它们的确切行为,而不是在A测试中使用B和C的真正实现。否则,您不仅测试A的单个单元,还隐式地测试B和C。
发布于 2010-05-27 07:34:04
作为JMock的作者,我不会从这个技术开始,除非您有一些使用TDD的经验。先从基础开始,然后让它发挥作用。一旦你开始经历与规模和发展一个设计的困难,回到技术。
Dave的书仍然是一个很好的介绍,也是唯一一个,我认为,这一代人解释得很好的嘲弄。在那之后,你可以考虑我们的,“成长的面向对象的软件,由测试指导”
如果有人告诉你,这一切都是为了让针对文件系统的测试更快一些,那就给它打折扣吧。
发布于 2010-05-25 18:16:56
您不需要真正的模拟来测试这个类,因为它唯一的协作者是一个Map,您可以像现在一样使用它。而且,您的类实际上没有做任何事情(除了委托),这就是为什么您觉得自己没有进行太多的测试。
直接测试可能是(我假设您使用的是JUnit 4 --您的代码是JUnit 3和4的奇怪混合体)
@Test
public void sizeIs0WhenEmpty()
{
Map<Integer, String> map = Collections.emptyMap();
Cache cache = new Cache(map)
assertEquals(0, cache.size());
}如果是模拟代码(假设模拟代码是正确的--我不使用JMock)
@Test
public void sizeIs0WhenEmpty()
{
context.checking(new Expectations() {{
atLeast(1).of(mockMap).size();
will(returnValue(0));
}});
assertEquals(0, cache.size());
}在这两种情况下,通过将映射设置为具有要测试的属性,然后检查缓存是否具有相同的属性(因为它是直接委托的)来设置系统。
我建议您在继续之前阅读关于JUnit。
https://stackoverflow.com/questions/2905157
复制相似问题