我想用Mockito测试下面的(简化)代码.我不知道如何告诉Mockito第一次失败,然后第二次成功.
for(int i = 1; i < 3; i++) {
String ret = myMock.doTheCall();
if("Success".equals(ret)) {
log.write("success");
} else if ( i < 3 ) {
log.write("failed, but I'll try again. attempt: " + i);
} else {
throw new FailedThreeTimesException();
}
}
Run Code Online (Sandbox Code Playgroud)
我可以设置成功测试:
Mockito.when(myMock).doTheCall().thenReturn("Success");
Run Code Online (Sandbox Code Playgroud)
并且失败测试:
Mockito.when(myMock).doTheCall().thenReturn("you failed");
Run Code Online (Sandbox Code Playgroud)
但是,我如何测试如果它失败一次(或两次)然后成功,那很好吗?
我正在使用Spring 3.1.4.RELEASE和Mockito 1.9.5.在我的Spring课程中,我有:
@Value("#{myProps['default.url']}")
private String defaultUrl;
@Value("#{myProps['default.password']}")
private String defaultrPassword;
// ...
Run Code Online (Sandbox Code Playgroud)
从我目前设置的JUnit测试开始,如下所示:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
public class MyTest
{
Run Code Online (Sandbox Code Playgroud)
我想为我的"defaultUrl"字段模拟一个值.请注意,我不想模拟其他字段的值 - 我想保留它们的原样,只保留"defaultUrl"字段.另请注意,setDefaultUrl我的课程中没有明确的"setter"方法(例如),我不想仅仅为了测试而创建任何方法.
鉴于此,我如何模拟该字段的值?
我有以下方法,我希望验证行为
public void methodToTest( Exception e, ActionErrors errors ) {
...
errors.add( "exception.message",
ActionMessageFactory.createErrorMessage(e.toString() ));
errors.add( "exception.detail",
ActionMessageFactory.createErrorMessage(e.getStackTrace()[0].toString() ));
...
}
Run Code Online (Sandbox Code Playgroud)
在我的@Test类中,我希望做这样的事情,以验证errors.add()是用"exception.message"调用,再用"exception.detail"调用
verify(errors).add(eq("exception.message"), any(ActionError.class));
verify(errors).add(eq("exception.detail"), any(ActionError.class));
Run Code Online (Sandbox Code Playgroud)
但Mockito抱怨如下
Argument(s) are different! Wanted:
actionErrors.add(
"exception.message",
<any>
);
Actual invocation has different arguments:
actionErrors.add(
"exception.detail",
org.apache.struts.action.ActionError@38063806
);
Run Code Online (Sandbox Code Playgroud)
我怎么能告诉Mockito检查这两个值?
在编写新的jUnit4测试时,我想知道是否使用@RunWith(MockitoJUnitRunner.class) 或MockitoAnnotations.initMocks(this).
我创建了一个新测试,向导自动使用Runner生成测试.MockitoJUnitRunner的Javadocs说明如下:
与JUnit 4.4及更高版本兼容,此运行器添加了以下行为:
初始化用Mock注释的模拟,因此不需要明确使用MockitoAnnotations.initMocks(Object).在每种测试方法之前初始化模拟.验证每个测试方法后的框架使用情况.
我不清楚使用Runner是否比我过去使用的initMocks()方法有任何优势.
任何想法或链接将不胜感激!
public class A {
public void method(boolean b){
if (b == true)
method1();
else
method2();
}
private void method1() {}
private void method2() {}
}
public class TestA {
@Test
public void testMethod() {
A a = mock(A.class);
a.method(true);
//how to test like verify(a).method1();
}
}
如何测试私有方法是否被调用,以及如何使用mockito测试私有方法???
我想从包含2个静态方法m1和m2的类中模拟静态方法m1.我希望方法m1返回一个对象.
我尝试了以下内容
1)
PowerMockito.mockStatic(Static.class, new Answer<Long>() {
@Override
public Long answer(InvocationOnMock invocation) throws Throwable {
return 1000l;
}
});
Run Code Online (Sandbox Code Playgroud)
这是调用m1和m2,它们具有不同的返回类型,因此它给出了返回类型不匹配错误.
2)PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l);
但是当执行m1时不会调用它.
3)PowerMockito.mockPartial(Static.class, "m1");
给出了mockPartial不可用的编译错误,这是我从http://code.google.com/p/powermock/wiki/MockitoUsage获得的.
我在一些测试中使用Mockito.
我有以下课程:
class BaseService {
public void save() {...}
}
public Childservice extends BaseService {
public void save(){
//some code
super.save();
}
}
Run Code Online (Sandbox Code Playgroud)
我想只模拟第二个调用(super.save)ChildService.第一个调用必须调用真正的方法.有没有办法做到这一点?
我有一个类似下面的代码:
Class A {
public boolean myMethod(someargs) {
MyQueryClass query = new MyQueryClass();
Long id = query.getNextId();
// some more code
}
}
Class MyQueryClass {
....
public Long getNextId() {
//lot of DB code, execute some DB query
return id;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我正在写一个测试A.myMethod(someargs).我想跳过真正的方法query.getNextId(),而是返回一个存根值.基本上,我想嘲笑MyQueryClass.
所以在我的测试用例中,我使用过:
MyQueryClass query = PowerMockito.mock(MyQueryClass.class);
PowerMockito.whenNew(MyQueryClass.class).withNoArguments().thenReturn(query);
when(query.getNextId()).thenReturn(1000000L);
boolean b = A.getInstance().myMethod(args);
//asserts
Run Code Online (Sandbox Code Playgroud)
我曾经@RunWith(PowerMockRunner.class)和@PrepareForTest({MyQueryClass.class})我的测试类的开始.
但是,当我调试测试,它仍然是调用真正的方法getNextId()中的MyQueryClass类.
我在这里错过了什么?任何人都可以提供帮助,因为我是Mockito和PowerMockito的新手.
我的代码如下,
@RunWith(MockitoJUnitRunner.class)
public class MyClass {
private static final String code ="Test";
@Mock
private MyClassDAO dao;
@InjectMocks
private MyClassService Service = new MyClassServiceImpl();
@Test
public void testDoSearch() throws Exception {
final String METHOD_NAME = logger.getName().concat(".testDoSearchEcRcfInspections()");
CriteriaDTO dto = new CriteriaDTO();
dto.setCode(code);
inspectionService.searchEcRcfInspections(dto);
List<SearchCriteriaDTO> summaryList = new ArrayList<SearchCriteriaDTO>();
inspectionsSummaryList.add(dto);
when(dao.doSearch(dto)).thenReturn(inspectionsSummaryList);//got error in this line
verify(dao).doSearchInspections(dto);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在低于例外
Run Code Online (Sandbox Code Playgroud)org.mockito.exceptions.misusing.UnnecessaryStubbingException: Unnecessary stubbings detected in test class: Test Clean & maintainable test code requires zero unnecessary code. Following stubbings are unnecessary (click to …
我有这样的方法:
public <T> method(String s, Class<T> t) {...}
Run Code Online (Sandbox Code Playgroud)
null当我对其他参数使用匹配器时,我需要检查是否传递给第二个参数,我一直这样做:
@SuppressWarnings("unchecked")
verify(client).method(eq("String"), any(Class.class));
Run Code Online (Sandbox Code Playgroud)
但是有没有更好的方法(没有压制警告)?T表示某些其他方法的返回类型,有时void在这些情况下null传入.