我在我的测试中使用EasyMock来模拟对象.但是,我如何模拟在我的代码中的其他位置创建的对象?查看以下psudo代码.我想模拟WebService#getPersonById,我该怎么做?
public class Person {
public Person find(int id) {
WebService ws = new WebService();
return ws.getPersonById(id);
}
}
public class PersonTest {
testFind() {
// How do I mock WebService#getPersonById here?
}
}
Run Code Online (Sandbox Code Playgroud) 我在单元测试中遵循了代码片段,
ClassToBeMocked mock = createMock(ClassToBeMocked.class); //I've statically imported EasyMock.*
mock.callMethod(); //This is a void method
expectLastCall();
replay(mock);
Run Code Online (Sandbox Code Playgroud)
但是当我运行测试时,实际上调用了callMethod()而不是预期.难道我做错了什么?
我是EasyMock或任何模拟框架的新手,因为这个问题而被阻止.任何帮助将不胜感激.
谢谢,安迪斯
我TestMe使用EasyMock 对一个类进行单元测试,并且其中一个方法(比如说method(N n))期望一个N具有本机方法的类型的参数(比方说nativeMethod()).
class TestMe {
void method(N n) {
// Do stuff
n.nativeMethod();
// Do more stuff
}
}
Run Code Online (Sandbox Code Playgroud)
method()需要N.nativeMethod()在某个时候调用,而我遇到的问题是我的N的Easymock模拟对象无法覆盖本机方法.我不拥有N级,但我可以TestMe以任何必要的方式进行重构.
我决定创建自己的课程FakeN extends N,这个课程无效nativeMethod:
class FakeN extends N {
FakeN(int pointer) {
super(pointer);
}
@Override
public void nativeMethod(Object o) {
// super.nativeMethod() is an actual native method defined as:
// public native void nativeMethod(Object o)
//
// IGNORE
}
}
Run Code Online (Sandbox Code Playgroud)
但是虽然编译器没有抱怨,但是当我运行测试时,它似乎N.nativeMethod()是被调用的而不是 …
我使用EasyMock构建了一个模拟对象,我试图让对象在方法调用后返回另一个对象.方法调用不会导致抛出任何异常,但它返回null,但我确定andReturn()调用具有非null参数.
我正在尝试使用EasyMock的一个非常简单的例子,但是我根本无法构建它.我有以下测试用例:
@Test
public void testSomething()
{
SomeInterface mock = EasyMock.createMock(SomeInterface.class);
SomeBase expected = new DerivesFromSomeBase();
EasyMock.expect(mock.send(expected));
}
Run Code Online (Sandbox Code Playgroud)
但是我EasyMock.expect(...在行中收到以下错误:
The method expect(T) in the type EasyMock is not applicable for the arguments (void)
Run Code Online (Sandbox Code Playgroud)
有人能指出我正确的方向吗?我完全迷失了.
我们可以使用Android Mock对Android应用程序的私有函数和字段进行单元测试吗?
如果是,请解释如何?
我有一个数据源,我可以从中请求一个(任何)国家/地区的人员列表,以及一个从该数据源检索人员并按字母顺序按名称对其进行排序的方法.我应该如何编写单元测试以确保我的方法的排序部分正常工作?
这就是我的SUT的样子:
class PeopleStuff {
public IData data;
public List<Person> getSortedPeopleForCountry(String countryName) {
List<Person> people = data.getPeopleForCountry(countryName);
Comparator nameComparator = new PersonNameComparator();
Collections.sort(people, nameComparator);
return people;
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我的单元测试的样子:
@Test public void testGetPeopleSortsByPeopleName() {
String COUNTRY = "Whatistan";
// set up test (the 3 lines below are actually in a @Before setup method)
PeopleStuff peopleStuff = new PeopleStuff();
IData mockData = createNiceMock(IData.class);
peopleStuff.data = mockData;
// set up data
List<PersonName> mockPeopleList = new ArrayList<PersonName>();
mockPeopleList.add(new Person(COUNTRY, "A"));
mockPeopleList.add(new Person(COUNTRY, "D")); …Run Code Online (Sandbox Code Playgroud) 我的测试中有以下几行:
Capture<MyType> myCapture = Capture.newInstance();
expect(myMockedObject.myMethod(capture(myCapture)).andReturn(...).times(2);
Run Code Online (Sandbox Code Playgroud)
当模拟被验证但myCapture.getValues().size()返回1 时,这种期望会通过.我期望每次方法调用捕获.如何捕获两个方法调用的参数?
如何HttpServletResponse为单元测试创建,我可以在其中编写输出流和标头(不是MockHttpServletResponse)?在 assert 块中,我希望将OutputStream标头与标准具进行比较httpServletResponse。
我用过Spring4,java8和EasyMocklib。
easymock ×10
java ×7
unit-testing ×4
android ×2
junit ×2
mocking ×2
null ×1
overriding ×1
spring ×1