- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在尝试做一个垄断游戏的模拟测试课。
我们已经得到了一些关于如何设置其中一些的说明,但也许我们只是误解了 JMock 的工作原理。
我们有使用 takeTurn()
的 Player 类。我们有 Die
、Board
和 Piece
这些都是支持模拟的接口(interface)。然后我们有 Square
类,它不包含任何值,但仅代表一个 Square。也许我们应该把它变成一个接口(interface),因为它什么也没有,但我不知道。
无论我们做什么,测试总是失败。我尝试省略某些部分,以便我们也只执行一个期望,但没有运气。我们是否完全误解了 JMock?
这是我们的 Player 类:
public class Player {
Die d;
Piece p;
Board b;
void takeTurn(Die d, Piece p, Board b) {
this.d = d;
this.p = p;
this.b = b;
int i = d.roll();
int v = d.roll();
Square newLoc = b.getSquare(p.getLocation(), i + v);
p.setLocation(newLoc);
}
}
这是我们的 PlayerTest 类:
public class PlayerTest extends TestCase {
Mockery context = new Mockery();
public void testTakeTurn() {
final Board b = context.mock(Board.class);
final Piece p = context.mock(Piece.class);
final Die d = context.mock(Die.class);
Player pl = new Player();
context.checking(new Expectations() {{
exactly(2).of (d).roll();
}});
context.checking(new Expectations() {{
oneOf (p).getLocation();
}});
final int diceroll = 5;
context.checking(new Expectations() {{
oneOf (b).getSquare(p.getLocation(), diceroll);
}});
final Square newLoc = new Square();
context.checking(new Expectations() {{
oneOf (p).setLocation(newLoc);
}});
pl.takeTurn(d,p,b);
context.assertIsSatisfied();
}
}
最佳答案
模拟背后的想法是你生成可以设定期望的假对象。期望包括将调用哪些方法以及这些方法将返回哪些结果。
后一个任务是您在当前代码中遗漏的。您需要告诉 JMock 模拟对象上的方法调用将返回什么值。如果没有告诉 JMock,它默认为 null
、0
、false
等值。
例如,您声明希望掷两次骰子,但没有提供模拟的 Dice
对象应返回的返回值。所以 JMock 将只返回 0
。稍后您假设这两个骰子的总和为 5
,这是错误的。
您的代码应更改为大致如下(未经测试):
public class PlayerTest extends TestCase {
Mockery context = new Mockery();
public void testTakeTurn() {
final Board b = context.mock(Board.class);
final Piece p = context.mock(Piece.class);
final Die d = context.mock(Die.class);
Player pl = new Player();
final int roll1 = 2;
final int roll2 = 3;
context.checking(new Expectations() {{
exactly(2).of (d).roll();
will(onConsecutiveCalls(
returnValue(roll1),
returnValue(roll2))
}});
final Location currentLocation = // set to your desired test loc...
context.checking(new Expectations() {{
oneOf (p).getLocation();
will(returnValue(currentLocation));
}});
final Square newLoc = new Square();
context.checking(new Expectations() {{
oneOf (b).getSquare(currentLocation, roll1 + roll2);
will(returnValue(newLoc));
}});
context.checking(new Expectations() {{
oneOf (p).setLocation(newLoc);
}});
pl.takeTurn(d,p,b);
context.assertIsSatisfied();
}
}
尽管我曾经很喜欢 JMock,但我必须同意 Mockito 使用起来更加友好的评论。如果您刚刚开始模拟,现在可能是切换的好时机。
关于java - jMock 不顾期望失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22686647/
jar jmock-2.5.1.jar 和 jmock-junit3-2.5.1.jar 有什么区别? jmock-junit 包含这两个框架吗? 谢谢 最佳答案 从jmock-junit3-2.5.
我正在尝试完成我的第一个 JMOCK 教程 http://www.jmock.org/getting-started.html ,而且进展并不顺利。 我遇到的问题如下: java.lang.Secur
我是 jMock 的新手,所以我正在一个简单的例子中尝试一下。但我不明白为什么它不起作用。这是我正在测试的类: package com.application; import com.domain.C
我有一些功能想要模拟从 main 调用(静态:我也读过 - jmock mocking a static method )。我最近读到 JMock 不支持静态函数的模拟。好吧,相关的代码(这给我带来了
在 JUNIT 测试中,我使用 JMOCK。在一些示例中,我看到了类似于以下代码片段的代码: mock.checking(new Expectations(){
阅读我看到的 jmock 文档: First we must import the jMock classes, define our test fixture class and create a
我正在使用junt和jock。假设我有一个对象接口(interface) Contact,并且在我的测试类中有一个类似这样的方法: @Test public void testAddOneContac
我正在使用 iBatis DAO 框架为应用程序编写测试。该应用程序在 java 1.4 环境中运行,因此我使用所有旧版本(JDK 1.4、JUnit3、iBatis 2.3 和 JMock 1.2)
是否可以为模拟对象赋值。例如: myMockObject = context.mock(MyObject.class); myMockObject.setId("someId"); 我正在测试的方法结
我正在为一个需要在其内部创建多个集合的类编写 JMock 测试。我为该类提供一个工厂,它将在需要时生成一个集合。 interface Factory { Collection newColl
我对 JUnit 测试类有以下期望: CustomEvent myCustomEvent = new CustomEvent(data1, data2); m_context.checking(new
我目前正在尝试做一个垄断游戏的模拟测试课。 我们已经得到了一些关于如何设置其中一些的说明,但也许我们只是误解了 JMock 的工作原理。 我们有使用 takeTurn() 的 Player 类。我们有
我要测试的方法是用不同的参数调用模拟方法: public void methodToTest(){ getMock().doSomething(1); getMock().doSometh
我正在努力学习如何编写测试。我也在学习 Java,有人告诉我应该学习/使用/练习 jMock,我在网上找到了一些有助于某些扩展的文章,例如: http://www.theserverside.com/
我目前正在编写一些涉及 JMock 的测试。我无法理解以下代码结构: context.checking(new Expectations() { //context is of type Mocke
下面我只是想模拟一个名为 TestWrapper 的类并在其上设置“允许”期望。但是,在设定期望时我会出错。当使用 easymock 并且只是设置期望时,这似乎并没有发生 import org.jmo
我正在设置一个模拟对象,每次调用方法 f() 时它应该返回一个新的业务对象。如果我简单地说 returnValue(new BusinessObj()),它将在每次调用时返回相同的引用。如果我不知道
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: jmock mocking a static method 我正在研究使用 XX 类静态方法的遗留单元测试。
我正在使用 JMock 来测试使用对象的类的行为。我想测试 a() 方法是否被调用。但是,b() 和 c() 也会在该对象上调用。因此,如果我期望 a(),它也必须期望 b() 和 c() 才能使测试
我的代码中有一个静态方法,我想以某种方式对其进行模拟。 我正在使用 jmock。 我想我可以做到这一点的一种方法是在静态方法周围有一个“包装类”,并且 mock 这个,但我希望有一个更好的解决方案。
我是一名优秀的程序员,十分优秀!