标签: mockito

模拟第一次调用失败,第二次调用成功

我想用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)

但是,我如何测试如果它失败一次(或两次)然后成功,那很好吗?

java mockito

101
推荐指数
5
解决办法
6万
查看次数

如何使用Mockito在Spring中模拟自动装配的@Value字段?

我正在使用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"方法(例如),我不想仅仅为了测试而创建任何方法.

鉴于此,我如何模拟该字段的值?

spring mockito autowired value-initialization

100
推荐指数
7
解决办法
10万
查看次数

如何使用不同的参数验证多个方法调用

我有以下方法,我希望验证行为

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检查这两个值?

java mockito

99
推荐指数
6
解决办法
7万
查看次数

@RunWith(MockitoJUnitRunner.class)vs MockitoAnnotations.initMocks(this)

在编写新的jUnit4测试时,我想知道是否使用@RunWith(MockitoJUnitRunner.class)MockitoAnnotations.initMocks(this).

我创建了一个新测试,向导自动使用Runner生成测试.MockitoJUnitRunner的Javadocs说明如下:

与JUnit 4.4及更高版本兼容,此运行器添加了以下行为:

初始化用Mock注释的模拟,因此不需要明确使用MockitoAnnotations.initMocks(Object).在每种测试方法之前初始化模拟.验证每个测试方法后的框架使用情况.

我不清楚使用Runner是否比我过去使用的initMocks()方法有任何优势.

任何想法或链接将不胜感激!

java junit4 mockito

98
推荐指数
2
解决办法
8万
查看次数

使用mockito测试私有方法

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测试私有方法???

java junit mockito

90
推荐指数
9
解决办法
28万
查看次数

PowerMockito模拟单个静态方法和返回对象

我想从包含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获得的.

java easymock mockito powermock java-ee

89
推荐指数
1
解决办法
20万
查看次数

Mockito如何只模拟超类方法的调用

我在一些测试中使用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.第一个调用必须调用真正的方法.有没有办法做到这一点?

mockito

86
推荐指数
4
解决办法
10万
查看次数

使用PowerMockito.whenNew()不会被模拟并调用原始方法

我有一个类似下面的代码:

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的新手.

java junit mockito powermock

82
推荐指数
2
解决办法
6万
查看次数

如何解决不需要的Stubbing异常

我的代码如下,

@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)

我正在低于例外

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 …
Run Code Online (Sandbox Code Playgroud)

java spring mockito

79
推荐指数
8
解决办法
7万
查看次数

如何将传递给Class <T>参数的null与Mockito匹配

我有这样的方法:

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传入.

java unit-testing mocking mockito

76
推荐指数
3
解决办法
6万
查看次数