使用JMock:
context.checking(new Expectations() {{
// Other oneOf() will() statements ...
oneOf(shopAccount).enter(100, with(any(String.class)));
will(returnValue(true));
// Other oneOf() will() statements ...
}});
Run Code Online (Sandbox Code Playgroud)
执行期间将引发以下异常:
java.lang.IllegalArgumentException:并非所有参数都被赋予显式匹配器:要么所有参数都必须由匹配器指定,要么所有参数都必须由值指定,您不能混合使用匹配器和值.
为什么我不能这样做?用with(any(Klass.class))?
这个比较表明,JMockit比其他框架有几个优点.
其他一个(JMock,EasyMock,Mockito,Unitils,PowerMock + Mockito/EasyMock)是否还有JMockit的优势?
有时,您希望测试一个类方法,并且希望在调用超类方法时进行预期.我没有找到一种方法来使用easymock或jmock在java中做这个期望(我认为这是不可能的).
有一个(相对)干净的解决方案,用超类方法逻辑创建一个委托,然后设置它的期望,但我不知道为什么以及什么时候使用该解决方案?任何想法/例子?
谢谢
我有以前有大量方法的类,所以我将这个方法的工作细分为'helper'方法.
这些辅助方法被声明private为强制封装 - 但是我想对大型公共方法进行单元测试.对辅助方法进行单元测试也是好的,就好像其中一个方法失败了,调用它的公共方法也会失败,这样我们就可以找出它失败的原因了吗?
另外,为了使用模拟对象测试这些,我需要将其可见性从私有更改为受保护,这是否可取?
我的代码中有一个静态方法,我想以某种方式来模拟.
我正在使用jmock.
我认为我可以这样做的一种方法是在静态方法周围使用"包装类"并模拟这个,但我希望有一个更好的解决方案.
我这是错误的方式吗?
反馈:
我将有一个接口和类有一个方法,只是调用静态方法.它允许我通过模拟对这个包装类的调用来模拟逻辑.(即使谈论它我也觉得很脏:))
如果使用JMock使用mocking编写Java单元测试,我们应该使用
Mockery context = new Mockery()
Run Code Online (Sandbox Code Playgroud)
要么
Mockery context = new JUnit4Mockery()
Run Code Online (Sandbox Code Playgroud)
两者之间有什么区别,我们什么时候应该使用哪个?
我正在尝试通过我的第一个JMOCK教程http://www.jmock.org/getting-started.html,但它并不顺利.
我遇到的问题如下:
java.lang.SecurityException: class "org.hamcrest.TypeSafeMatcher"'s signer information does not match signer information of other classes in the same package
at java.lang.ClassLoader.checkCerts(Unknown Source)
at java.lang.ClassLoader.preDefineClass(Unknown Source)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown …Run Code Online (Sandbox Code Playgroud) 增长面向对象软件这本书在jMock中给出了几个例子,其中状态是明确的,而不是通过API公开它.我真的喜欢这个主意.在Mockito有办法做到这一点吗?
这是本书的一个例子
public class SniperLauncherTest {
private final States auctionState = context.states("auction state")
.startsAs("not joined");
@Test public void addsNewSniperToCollectorAndThenJoinsAuction() {
final String itemId = "item 123";
context.checking(new Expectations() {{
allowing(auctionHouse).auctionFor(itemId); will(returnValue(auction));
oneOf(sniperCollector).addSniper(with(sniperForItem(item)));
when(auctionState.is("not joined"));
oneOf(auction).addAuctionEventListener(with(sniperForItem(itemId)));
when(auctionState.is("not joined"));
one(auction).join(); then(auctionState.is("joined"));
}});
launcher.joinAuction(itemId);
}
}
Run Code Online (Sandbox Code Playgroud) 我希望实现以下行为.我的测试类依赖于其他一些类,我希望用jMock来模拟这种依赖.大多数方法会返回一些标准值,但有一个方法,在这里我想打个电话到存根实现,我知道我可以调用从这个方法will(...),但我想用完全相同的参数来调用的方法传递给模拟方法的.
测试
@Test
public void MyTest(){
Mockery context = new Mockery() {
{
setImposteriser(ClassImposteriser.INSTANCE);
}
};
IDependency mockObject = context.mock(IDependency.class);
Expectations exp = new Expectations() {
{
allowing(mockObject).methodToInvoke(????);
will(stubMethodToBeInvokedInstead(????));
}
};
}
Run Code Online (Sandbox Code Playgroud)
接口
public interface IDependency {
public int methodToInvoke(int arg);
}
Run Code Online (Sandbox Code Playgroud)
要改为调用的方法
public int stubMethodToBeInvokedInstead(int arg){
return arg;
}
Run Code Online (Sandbox Code Playgroud)
那么我如何捕获传递给被模拟方法的参数,所以我可以将它们传递给存根方法呢?
编辑
再举一个例子,假设我想INameSource在下面的(C#)代码中模拟依赖关系来测试类的扬声器
public class Speaker
{
private readonly string firstName;
private readonly string surname;
private INameSource nameSource ;
public Speaker(string firstName, string surname, INameSource nameSource) …Run Code Online (Sandbox Code Playgroud) 我坐下来,今天写一个匹配,并决定采取快速查找在JMock的文档刷新我对进程的内存,并注意到在org.hamcrest.Factory注释的参考.注释的文档说明.
标记Hamcrest静态工厂方法,以便工具识别它们.工厂方法等同于命名构造函数.
是否有任何工具实际使用此注释?