标签: mockito

如何使用Mockito在java中模拟新的Date()

我有一个使用当前时间进行一些计算的函数.我想用mockito嘲笑它.

我要测试的类的一个例子:

public class ClassToTest {
    public long getDoubleTime(){
        return new Date().getTime()*2;
    }
}
Run Code Online (Sandbox Code Playgroud)

我喜欢这样的东西:

@Test
public void testDoubleTime(){
   mockDateSomeHow(Date.class).when(getTime()).return(30);
   assertEquals(60,new ClassToTest().getDoubleTime());
}
Run Code Online (Sandbox Code Playgroud)

有可能嘲笑吗?我不想更改"经过测试"的代码以便进行测试.

java junit unit-testing mocking mockito

37
推荐指数
3
解决办法
7万
查看次数

Android上的Mockito + Dexmaker

我想在我的Android项目中使用Mockito.我找到了非常好的教程来处理它:http://www.paulbutcher.com/2012/05/mockito-on-android-step-by-step/

基本上它使用新版本的Mockito + Dexmaker,一切都按预期工作.
但是,当我尝试模拟一些Android特定对象时,即:

Context context = mock(Context.class);
Run Code Online (Sandbox Code Playgroud)

我收到这个例外:

java.lang.IllegalArgumentException: 
    dexcache == null (and no default could be found; 
    consider setting the 'dexmaker.dexcache' system property)
at com.google.dexmaker.DexMaker.generateAndLoad(DexMaker.java:359)
at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:252)
at com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:54)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)
Run Code Online (Sandbox Code Playgroud)

知道怎么解决吗?

android mockito dexmaker

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

当看起来没问题时,Mockito会给出UnfinishedVerificationException

UnfinishedVerificationException当我认为我已经完成了所有事情时,Mockito似乎正在投掷.这是我的部分测试用例:

HttpServletRequest req = mock(HttpServletRequest.class);
when(req.getHeader("Authorization")).thenReturn("foo");

HttpServletResponse res = mock(HttpServletResponse.class);

classUnderTest.doMethod(req, res); // Use the mock

verify(res, never());
verify(req).setAttribute(anyString(), anyObject());
Run Code Online (Sandbox Code Playgroud)

这是部分类和方法:

class ClassUnderTest extends AnotherClass {
    @Override
    public String doMethod(ServletRequest req, ServletRequest res) {
        // etc.
        return "someString";
    }
}
Run Code Online (Sandbox Code Playgroud)

忽略你不应该模仿你不拥有的接口的事实,为什么Mockito给我以下信息?

org.mockito.exceptions.misusing.UnfinishedVerificationException: 
Missing method call for verify(mock) here:
-> at (redacted)

Example of correct verification:
    verify(mock).doSomething()

Also, this error might show up because you verify either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.

at [test method name and …
Run Code Online (Sandbox Code Playgroud)

junit unit-testing mockito junit5

37
推荐指数
5
解决办法
3万
查看次数

修改void函数的输入参数,然后读取它

我有一个相当复杂的java函数,我想用jUnit进行测试,我正在使用Mockito来达到这个目的.这个函数看起来像这样:

public void myFunction (Object parameter){
   ...
   doStuff();
   ...
   convert(input,output);
   ...
   parameter.setInformationFrom(output);
}
Run Code Online (Sandbox Code Playgroud)

函数convert根据输入设置输出的属性,它是一个void类型函数,尽管"output"参数正在被使用,就像它被函数返回一样.这个转换函数是我想要模拟的,因为我不需要依赖于测试的输入,但我不知道如何做到这一点,因为我对Mockito不是很熟悉.

我已经看到基本情况when(something).thenReturn(somethingElse) 或者我理解的doAnswer方法与前一个类似,但可以添加更多逻辑,但我不认为这些情况适合我的情况,因为我的函数没有返回声明.

java junit mocking mockito

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

Mockito如何捕获传递给注入的模拟对象方法的参数?

我正在尝试测试一个服务类,它在内部使用Spring AMQP连接对象.此连接对象由Spring注入.但是,我不希望我的单元测试实际上与AMQP代理通信,因此我使用Mockito注入连接对象的模拟.

/** 
 * The real service class being tested.  Has an injected dependency. 
 */ 
public class UserService {

   @Autowired
   private AmqpTemplate amqpTemplate;

   public final String doSomething(final String inputString) {
      final String requestId = UUID.randomUUID().toString();
      final Message message = ...;
      amqpTemplate.send(requestId, message);
      return requestId;
   }
}

/** 
 * Unit test 
 */
public class UserServiceTest {

   /** This is the class whose real code I want to test */
   @InjectMocks
   private UserService userService;

   /** This is a dependency of the real …
Run Code Online (Sandbox Code Playgroud)

java spring unit-testing mockito

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

如何使用Retrofit 2在单元测试期间创建retrofit.Response对象

在使用RxJava和Retrofit 2时,我正在尝试创建单元测试以覆盖我的应用程序何时收到特定响应.

我的问题是,使用Retrofit 2,我无法看到一个很好的方法来创建一个不使用反射的retrofit.Response对象.

@Test
public void testLogin_throwsLoginBadRequestExceptionWhen403Error() {


    Request.Builder requestBuilder = new Request.Builder();
    requestBuilder.get();
    requestBuilder.url("http://localhost");

    Response.Builder responseBuilder = new Response.Builder();
    responseBuilder.code(403);
    responseBuilder.protocol(Protocol.HTTP_1_1);
    responseBuilder.body(ResponseBody.create(MediaType.parse("application/json"), "{\"key\":[\"somestuff\"]}"));
    responseBuilder.request(requestBuilder.build());

    retrofit.Response<LoginResponse> aResponse = null;

    try {
        Constructor<retrofit.Response> constructor= (Constructor<retrofit.Response>) retrofit.Response.class.getDeclaredConstructors()[0];
        constructor.setAccessible(true);
        aResponse = constructor.newInstance(responseBuilder.build(), null, null);
    } catch (Exception ex) {
        //reflection error
    }

    doReturn(Observable.just(aResponse)).when(mockLoginAPI).login(anyObject());

    TestSubscriber testSubscriber = new TestSubscriber();
    loginAPIService.login(loginRequest).subscribe(testSubscriber);

    Throwable resultError = (Throwable) testSubscriber.getOnErrorEvents().get(0);
    assertTrue(resultError instanceof LoginBadRequestException);
}
Run Code Online (Sandbox Code Playgroud)

我尝试过使用以下内容,但这会创建一个OkHttp响应与一个Retrofit响应.

    Request.Builder requestBuilder = new Request.Builder();
    requestBuilder.get();
    requestBuilder.url("http://localhost");

    Response.Builder responseBuilder = new Response.Builder();
    responseBuilder.code(403); …
Run Code Online (Sandbox Code Playgroud)

android unit-testing mockito rx-java retrofit

37
推荐指数
3
解决办法
1万
查看次数

MOCKITO:它是什么,它和Junit有什么不同?

我想知道Mockito是什么?

它是支持Junit还是编写Junit测试用例的环境?

有人可以解释一下Junit和Mockito之间的区别吗?

testing junit unit-testing mocking mockito

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

Mockito的Matcher vs Hamcrest Matcher?

这将是一个简单的,但我找不到它们和使用哪一个,如果我有两个lib包含在我的类路径中?

java hamcrest mockito

36
推荐指数
1
解决办法
3万
查看次数

使用@Mock和@InjectMocks

我目前正在研究Mockito框架,并且我使用Mockito创建了几个测试用例.但后来我读到的不是调用模拟(SomeClass的的.class)我可以使用@Mock@InjectMocks-我需要做的唯一一件事情就是我的注释测试类@RunWith(MockitoJUnitRunner.class)或使用MockitoAnnotations.initMocks(this);@Before方法.

但它不起作用 - 似乎@Mock不会起作用!这是我的2个代码修订版 - 一个使用注释,一个没有.

我究竟做错了什么?

public class ReportServiceImplTestMockito {

    private TaskService       mockTaskService; // This is the Mock object
    private ReportServiceImpl service;

    @Before
    public void init(){
        service         = new ReportServiceImpl();
        mockTaskService = mock(TaskServiceImpl.class);
        service.setTaskServiceImpl(mockTaskService);
    }
/// ...

 Some tests
}
Run Code Online (Sandbox Code Playgroud)

正如我所说 - 这项工作很棒.但以下不会:

@RunWith(MockitoJUnitRunner.class)
public class ReportServiceImplTestMockito {

     @Mock 
     private TaskService      mockTaskService;

     @InjectMocks 
     private ReportServiceImpl service;

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

这是ReportServiceImpl班级:

@Service
public …
Run Code Online (Sandbox Code Playgroud)

java mocking mockito

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

如何在Junit中使用@InjectMocks和@Autowired注释

我有一个A类,它使用3个不同的类和自动装配

public class A () {

    @Autowired
    private B b;

    @Autowired
    private C c;

    @Autowired
    private D d;
}
Run Code Online (Sandbox Code Playgroud)

在测试它们时,我希望只有2个类(B&C)作为模拟,并且将D类自动装配为正常运行,此代码对我不起作用:

@RunWith(MockitoJUnitRunner.class)
public class aTest () {

    @InjectMocks
    private A a;

    @Mock
    private B b;

    @Mock
    private C c;

    @Autowired
    private D d;
}
Run Code Online (Sandbox Code Playgroud)

甚至可以这样做吗?

java junit spring mocking mockito

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