这可能吗?我尝试过,EasyMock.expectLastCall().times(0);但EasyMock抱怨时间必须> = 1
我遇到了EasyMock 2.5.2和JUnit 4.8.2(通过Eclipse运行)的问题.我在这里阅读了所有类似的帖子,但没有找到答案.我有一个包含两个测试相同方法的测试的类.我正在使用匹配器.
以下是测试代码的简化版本:
private Xthing mockXthing;
private MainThing mainThing;
@Before
public void setUp() {
mockXthing = EasyMock.createMock(Xthing.class);
mainThing = new MainThing();
mainThing.setxThing(mockXthing);
}
@After
public void cleanUp() {
EasyMock.reset(mockXthing);
}
@Test
public void testTwo() {
String abc = "abc";
EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(abc);
EasyMock.replay(mockXthing);
String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
assertEquals("abc", testResult);
EasyMock.verify(mockXthing);
}
@Test
public void testOne() {
String xyz = "xyz";
EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(xyz);
EasyMock.replay(mockXthing);
String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
assertEquals("xyz", testResult);
EasyMock.verify(mockXthing);
}
Run Code Online (Sandbox Code Playgroud)
第二次(或最后一次)测试总是失败,并出现以下错误:
java.lang.IllegalStateException: 1 …Run Code Online (Sandbox Code Playgroud) 我是模拟框架的新手,我的工作需要模拟框架来完成单元测试.在当前的代码库中,我可以看到上面3个框架正在不同的地方用于单元测试.那么,我应该在上述3个框架中选择哪一个?
有时,您希望测试一个类方法,并且希望在调用超类方法时进行预期.我没有找到一种方法来使用easymock或jmock在java中做这个期望(我认为这是不可能的).
有一个(相对)干净的解决方案,用超类方法逻辑创建一个委托,然后设置它的期望,但我不知道为什么以及什么时候使用该解决方案?任何想法/例子?
谢谢
任何人都可以提出任何有关如何最好地使用EasyMock预期来电的建议Runtime.getRuntime().exec(xxx)吗?
我可以将调用移动到另一个实现接口的类中的方法,但不希望在理想的世界中.
interface RuntimeWrapper {
ProcessWrapper execute(String command) throws IOException;
}
interface ProcessWrapper {
int waitFor() throws InterruptedException;
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有人有任何其他建议?
我们正在考虑切换到Spring 3.0并遇到Spring 3.0,EasyMock和Java Generics的问题.
在一个地方,我们正在嘲笑Spring 3.0 AbstractBeanFactory,特别是这个方法:
public Class<?> getType(String name) throws NoSuchBeanDefinitionException { ... }
Run Code Online (Sandbox Code Playgroud)
在早期版本的Spring中,这会返回一个非泛型的,一切都很好.但是,使用泛型,我们遇到了麻烦:
expect(mockBeanFactory.getType(CLASS_NAME)).andReturn(SOME_CLASS);
Run Code Online (Sandbox Code Playgroud)
因为getType返回Class<?>,andReturn需要Class<?>作为参数,这根本不能正常工作.
这有一个已知的解决方法吗?
我有一个看起来很奇怪的问题.我有以下设置:
界面:
package com.example;
public interface SomeDependency {
}
Run Code Online (Sandbox Code Playgroud)
弹簧组件:
package com.example;
@Component
public class SomeClass {
}
Run Code Online (Sandbox Code Playgroud)
带有由EasyMock生成的模拟bean的spring test配置:
<beans ....>
<context:component-scan base-package="com.example"/>
<bean id="someInterfaceMock" class="org.easymock.EasyMock" factory-method="createMock">
<constructor-arg value="com.example.SomeDependency" />
</bean>
</beans>
Run Code Online (Sandbox Code Playgroud)
并进行单元测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/testconfig.xml")
public class SomeClassTest {
@Autowired
SomeClass someClass;
@Autowired
SomeDependency someDependency;
@Test
public void testSomeClass() throws Exception {
assertNotNull(someClass);
}
@Test
public void testSomeDependency() throws Exception {
assertNotNull(someDependency);
}
}
Run Code Online (Sandbox Code Playgroud)
项目编译并且测试通过没有任何问题,即SomeClass("真实"对象)和SomeDependency(由EasyMock生成的模拟对象)的自动装配成功.
但是,如果我将SomeClass的实现更改为:
@Component
public class SomeClass { …Run Code Online (Sandbox Code Playgroud) 在我的单元测试中,我使用EasyMock来创建模拟对象.在我的测试代码中,我有类似的东西
EasyMock.expect(mockObject.someMethod(anyObject())).andReturn(1.5);
Run Code Online (Sandbox Code Playgroud)
所以,现在EasyMock将接受任何电话someMethod().有没有办法获得传递给它的真正价值mockObject.someMethod(),或者我需要EasyMock.expect()为所有可能的情况编写声明?
我有这样的结构:
public class CacheWrapper {
private Map<Object, Object> innerMap;
public CacheWrapper() {
//initialize the innerMap with an instance for an in-memory cache
//that works on external server
//current implementation is not relevant for the problem
innerMap = ...;
}
public void putInSharedMemory(Object key, Object value) {
innerMap.put(key, value);
}
public Object getFromSharedMemory(Object key) {
return innerMap.get(key);
}
}
Run Code Online (Sandbox Code Playgroud)
我的客户端类(你可以说它看起来像这样):
public class SomeClient {
//Logger here, for exception handling
Logger log = ...;
private CacheWrapper cacheWrapper;
//getter and setter for cacheWrapper... …Run Code Online (Sandbox Code Playgroud)