标签: mockito

Mockito可以根据方法调用时的值验证参数吗?

我有一个FooSUT Bar类和一个类,它是它的合作者.Foo呼吁run(List<Object> values)Bar以" expectedList"作为参数.然后,Foo将为此添加一些元素,以List使其状态与调用时的状态不同run().这是我的测试用例.

@Test
public void testFoo() {
    Bar collaborator = spy(new Bar()); 
    Foo sut = new Foo(collaborator);
    verify(collaborator).run(expectedList);
}
Run Code Online (Sandbox Code Playgroud)

请注意,协作者实际上是间谍对象而不是模拟对象.此测试用例将失败,因为即使run()使用等于的参数调用expectedList,它也会被修改,因此它的当前值不再等于expectedList.然而,这是它应该工作的方式,所以我想知道是否有办法让Mockito在调用方法时存储参数的快照,并根据这些值而不是最近的值来验证它们.

java unit-testing mockito

17
推荐指数
1
解决办法
7855
查看次数

@InjectMocks的等效方法

以下方法的等效方法是什么:

@Mock
MyType1 myType1;

@Autowired
@InjectMocks
MyType2 myType2;
Run Code Online (Sandbox Code Playgroud)

我可以代替@Mock使用mock(MyType1.class).

但是如何@InjectMocks用方法调用替换?像这样的东西:

injectMocks(MyType2.class)
Run Code Online (Sandbox Code Playgroud)

java junit mocking mockito

17
推荐指数
2
解决办法
1万
查看次数

被测试的类中的模拟类

我怎么能和Mockito一起模拟我班上正在测试的其他课程?

例如:

MyClass.java

class MyClass {
    public boolean performAnything() {
        AnythingPerformerClass clazz = new AnythingPerformerClass();
        return clazz.doSomething();        
    }
}
Run Code Online (Sandbox Code Playgroud)

AnythingPerformerClass.java

class AnythingPerformerClass {
    public boolean doSomething() {
        //very very complex logic
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

并测试:

@Test
public void testPerformAnything() throws Exception {
    MyClass clazz = new MyClass();
    Assert.assertTrue(clazz.performAnything());
}
Run Code Online (Sandbox Code Playgroud)

我可以欺骗AnythingPerformerClass从中排除不必要的逻辑AnythingPerformerClass吗?我可以覆盖doSomething()简单返回的方法truefalse

为什么我指定Mockito,因为我需要使用Robolectric进行Android测试.

java unit-testing junit4 mockito robolectric

17
推荐指数
1
解决办法
5万
查看次数

如何创建CloseableHttpResponse对象来帮助测试?

我正在尝试构建一个CloseableHttpResponse模拟对象,以便在我的一个单元测试中返回,但是它没有构造函数.我找到了这个DefaultHttpResponseFactory,但它只生成一个HttpResponse.构建CloseableHttpResponse的简单方法是什么?我是否需要调用execute()我的测试然后设置statusLineentity?这似乎是一种奇怪的方法.

这是我试图模拟的方法:

public static CloseableHttpResponse getViaProxy(String url, String ip, int port, String username,
                                                String password) {
    CredentialsProvider credsProvider = new BasicCredentialsProvider();
    credsProvider.setCredentials(
            new AuthScope(ip, port),
            new UsernamePasswordCredentials(username, password));
    CloseableHttpClient httpclient = HttpClients.custom()
            .setDefaultCredentialsProvider(credsProvider).build();
    try {
        RequestConfig config = RequestConfig.custom()
                .setProxy(new HttpHost(ip, port))
                .build();
        HttpGet httpGet = new HttpGet(url);
        httpGet.setConfig(config);

        LOGGER.info("executing request: " + httpGet.getRequestLine() + " via proxy ip: " + ip + " port: " + port +
                " …
Run Code Online (Sandbox Code Playgroud)

java mocking mockito apache-commons-httpclient

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

如何将多个Mockito匹配器与逻辑"和"/"或"结合起来?

我想使用Mockito验证字符串参数是否满足两个条件:

verify(mockClass).doSomething(Matchers.startsWith("prefix"));
verify(mockClass).doSomething(Matchers.endsWith("suffix"));
Run Code Online (Sandbox Code Playgroud)

如何将这两者合并为一个陈述?

mockito

17
推荐指数
1
解决办法
7380
查看次数

Mockito NotaMockException

我正面临着Mockito junit测试的问题.我是新手,我对我面临的问题感到困惑.任何有关这方面的帮助将不胜感激.

class Activity{

    public void firstMethod(){

      String str = secondMethod();
   }

    public String secondMethod(){
      String str = null;

      /*  some Code */

      return str;
   }
}
Run Code Online (Sandbox Code Playgroud)

获得例外:

*org.mockito.exceptions.misusing.NotAMockException: 
 Argument passed to when() is not a mock!*
Run Code Online (Sandbox Code Playgroud)

在下面的代码中

class ActivityTest(){

  Activity act;

  @Before
  public void setup(){
     act = new Activity();
  }

  @Test
  public void testFirstMethod(){

      Mockito.doReturn(Mockito.anyString()).when(act).secondMethod();
      act.firstMethod();
      verify(act).secondMethod();
  }
} 
Run Code Online (Sandbox Code Playgroud)

我知道活动不是模拟,但我不确定如何解决这个问题,因为secondMethod()同一个类中的方法.我需要编写规则,secondMethod()因为我已经完成了单元测试.组合的定义secondMethod()具有外部依赖性.我应该嘲笑存在的外部依赖关系secondMethod()并为它们编写规则而不是规则secondMethod()吗?

我发现这篇文章: Mockito Spy'ing对被单元测试的对象 然而将secondMethod()分成另一个类是没有意义的.我的方法与这个类有关.创建一个不同的测试类对我来说似乎不对.即使使用spy()模拟实际类也不是最正确的方法,正如帖子中已经解释过的那样.

我不认为我应该创建一个Activity类的模拟,因为那是我正在测试的类.我非常感谢对此的帮助和见解.

java junit unit-testing mockito

17
推荐指数
1
解决办法
4万
查看次数

Android Jack mockito另类

也许还为时过早,但正如杰克和吉尔今天宣布的那样,我对此感到非常兴奋.我真的很想去,但他们也说:

读取.class文件的各种工具(例如JaCoCo,Mockito和一些lint检查)目前与Jack编译器不兼容.

杰克编译器已有一个模拟替代品吗?

java android mockito dex android-jack-and-jill

17
推荐指数
1
解决办法
587
查看次数

@RunWith(PowerMockRunner.class)vs @RunWith(MockitoJUnitRunner.class)

在通常使用@Mock@InjectMocks注释的模拟中,测试中的类应该运行@RunWith(MockitoJUnitRunner.class).

@RunWith(MockitoJUnitRunner.class)
public class ReportServiceImplTestMockito {

     @Mock 
     private TaskService      mockTaskService;

     @InjectMocks 
     private ReportServiceImpl service;

         // Some tests
}
Run Code Online (Sandbox Code Playgroud)

但在某些例子中,我看到@RunWith(PowerMockRunner.class)被使用:

@RunWith(PowerMockRunner.class)
public class Tests {
  @Mock
  private ISomething mockedSomething;

  @Test
  public void test1() {
    // Is the value of mockedSomething here
  }

  @Test
  public void test2() {
    // Is a new value of mockedSomething here
  }
}
Run Code Online (Sandbox Code Playgroud)

有人可以指出它的差异是什么时候我想用一个而不是另一个?

java mocking mockito powermockito

17
推荐指数
1
解决办法
2万
查看次数

JUnit测试AspectJ

我正在尝试为Custom Aspect编写Junit测试.这是Aspect Class Snippet:

@Aspect
@Component
public class SampleAspect {

    private static Logger log = LoggerFactory.getLogger(SampleAspect.class);

    @Around("execution(* org.springframework.data.mongodb.core.MongoOperations.*(..)) || execution(* org.springframework.web.client.RestOperations.*(..))")
    public Object intercept(final ProceedingJoinPoint point) throws Throwable {
        logger.info("invoked Cutom aspect");
         return point.proceed();

    }

}
Run Code Online (Sandbox Code Playgroud)

因此,只要关节点与切入点匹配,上述方面就会截获.它的工作正常.

但我的问题是如何对该类进行单元测试.我有以下Junit测试:

@Test(expected = MongoTimeoutException.class)
    public void TestWithMongoTemplate() {
        //MongoDocument class
        TestDocument test = new TestDocument();

        ApplicationContext ctx = new AnnotationConfigApplicationContext(TestMongoConfigurationMain.class);
        MongoTemplate mongoTemplate = ctx.getBean(MongoTemplate.class);

        //this call is being intercepted by SampleAspect
        mongoTemplate.save(test);

    }
Run Code Online (Sandbox Code Playgroud)

因此,我mongoTemplate.save(test)在Junit中被拦截,SampleAspect因为它匹配切入点.但是,我应该如何确保junits(可能通过声明)SampleAspect在调用该关节点时我正在拦截?

我不能断言返回值,intercept()因为除了执行关节点之外没有什么特别之处.因此,我的Junit无法找到任何区别,无论是由方面执行还是基于返回值的常规执行. …

java junit aspectj spring-aop mockito

17
推荐指数
1
解决办法
2万
查看次数

如何在Java Spring中模拟RestTemplate?

public class ServiceTest {
    @Mock
    RestTemplate restTemplate = new RestTemplate();
    @InjectMocks
    Service service = new Service();
    ResponseEntity responseEntity = mock(ResponseEntity.class);

    @Test
    public void test() throws Exception {
        Mockito.when(restTemplate.getForEntity(
                Mockito.anyString(),
                Matchers.any(Class.class)
                ))
                .thenReturn(responseEntity);
        boolean res = service.isEnabled("something");
        Assert.assertEquals(res, false);
    }
Run Code Online (Sandbox Code Playgroud)

我试图测试一个包含restclient的服务的简单测试.它看起来我没有RestTemplate成功模拟.它看起来像代码获得真实数据而不是模拟数据.任何人都可以帮助我.

服务本身看起来像这样:

public class Service{
    public boolean isEnabled(String xxx) {
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class);
        if(...)return true;
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

java unit-testing spring-mvc mockito

17
推荐指数
2
解决办法
5万
查看次数