标签: 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
查看次数

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万
查看次数

什么是 mockito-inline 以及它如何模拟最终方法?

Mockito 中的 Javadocs 说——“从 2.7.6 版开始,我们提供了‘mockito-inline’工件,它可以在不配置 MockMaker 扩展文件的情况下启用内联模拟制作”。这是什么意思?mockito-inline 是如何工作的?为什么要为 mockito-inline 制作一个单独的工件?

java testing unit-testing mockito

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

使用@Slf4j注释创建时如何模拟Logger?

我有一个带有 @Slf4j 注释的类。

我尝试编写一个测试并模拟记录器,但它不起作用。

@RequiredArgsConstructor
@Slf4j
public abstract class ExampleClass {
    
    protected final PropsClass properties;
    
    protected void logInfo(..) {
        log.info(...);
        clearMappedDiagnosticContext();
    }
}
Run Code Online (Sandbox Code Playgroud)

测试如下所示:

@RunWith(MockitoJUnitRunner.class)
public class ExampleClassTest {
    
    @Mock
    Logger logger;
    
    @Mock
    PropsClass properties;
    
    @InjectMocks
    ExampleClass exampleClass;
    
    @Test
    public void logSomethingtest() {
        ...
        exampleClass.logInfo(...);
        Mockito.verify(logger).info(marker, "foo bar {}", ...);
    }
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

Wanted but not invoked:
logger.info(
    MY_MARKER,
    "..........",
    "....",
    "....",
    0L
);

Actually, there were zero interactions with this mock.
Run Code Online (Sandbox Code Playgroud)

问题是,如何模拟 Logger?

java junit unit-testing slf4j mockito

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

JMockit有任何缺点吗?

这个比较表明,JMockit比其他框架有几个优点.

其他一个(JMock,EasyMock,Mockito,Unitils,PowerMock + Mockito/EasyMock)是否还有JMockit的优势?

java unit-testing jmockit jmock mockito

16
推荐指数
2
解决办法
5594
查看次数

MockMVC和Mockito返回状态预期<200>但<415>

我正在测试一个api端点,它可以从一个http海报(即PAW)中运行,但是我无法通过代码进行测试.

我是Mockito和MockMVC的新手,所以任何帮助都会受到赞赏.

测试如下:

 @Test
 public void createPaymentTest() throws Exception {
    User user = new User("ben", "password", "a@a.com");

    SuccessResponseDTO successDTO = new SuccessResponseDTO();
    successDTO.setSuccess(true);

    when(userService.getLoggedInUser()).thenReturn(user);
    when(paymentService.makePayment(Mockito.any(PaymentRequestDTO.class), Mockito.any(User.class))).thenReturn(successDTO.getSuccess());

    this.mockMvc.perform(post("/payment")).andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON)).andDo(MockMvcResultHandlers.print())
            .andExpect(jsonPath("$.success").value(successDTO.getSuccess()));

}
Run Code Online (Sandbox Code Playgroud)

SuccessResponseDTO只包含一个属性,一个布尔"成功".

它正在测试的方法如下:

@RequestMapping(value = "/payment", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public SuccessResponseDTO createPayment(@RequestBody PaymentRequestDTO payment) {
    User loggedInUser = userService.getLoggedInUser();
    LOGGER.info("Logged in user found...creating payment...");

    Assert.notNull(payment.getAccountId(), "Missing user account id");
    Assert.notNull(payment.getPayeeAccountNumber(), "Missing payee acount number");
    Assert.notNull(payment.getPayeeName(), "Missing payee name");
    Assert.notNull(payment.getPayeeSortCode(), "Missing payee sort code");
    Assert.notNull(payment.getPaymentAmount(), "Missing payee amount"); …
Run Code Online (Sandbox Code Playgroud)

java spring spring-mvc mockito

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

Mockito - thenReturn总是返回null对象

我正在尝试实现Mockito来测试一个特定的方法,但.thenReturn(...)似乎总是返回一个null对象,而不是我想要的:

切:

public class TestClassFacade {

  // injected via Spring
  private InterfaceBP bpService;

  public void setBpService(InterfaceBP bpService) {

      this.bpService = bpService;
  }

  public TestVO getTestData(String testString) throws Exception {

    BPRequestVO bpRequestVO = new BPRequestVO();

    bpRequestVO.setGroupNumber(testString) ;
    bpRequestVO.setProductType("ALL") ;           
    bpRequestVO.setProfileType("Required - TEST") ;

    IBPServiceResponse serviceResponse = bpService.getProduct(bpRequestVO);  //PROBLEM

    if (serviceResponse.getMessage().equalsIgnoreCase("BOB")) {

        throw new Exception();

    } else {

        TestVO testVO = new TestVO();
    }

    return testVO;
  }

}
Run Code Online (Sandbox Code Playgroud)

弹簧配置:

<bean id="testClass" class="com.foo.TestClassFacade">

   <property name="bpService" ref="bpService" />

</bean>

<bean id="bpService" class="class.cloud.BPService" />
Run Code Online (Sandbox Code Playgroud)

Mockito测试方法: …

java null mockito

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

Mockito @InjectMocks不适用于具有相同类型的字段

我很惊讶地发现,以下简单的代码示例并不适用于所有Mockito版本> 1.8.5

@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

    @Mock(name = "b2")
    private B b2;

    @InjectMocks
    private A a;

    @Test
    public void testInjection() throws Exception {
        assertNotNull(a.b2); //fails
        assertNull(a.b1); //also fails, because unexpectedly b2 mock gets injected here
    }

    static class A{
        private B b1;
        private B b2;
    }

    interface B{}
}
Run Code Online (Sandbox Code Playgroud)

在javadocs(http://docs.mockito.googlecode.com/hg/latest/org/mockito/InjectMocks.html)中有一个引用:

注1:如果你有相同类型(或相同的擦除)的字段,最好用匹配的字段命名所有@Mock注释字段,否则Mockito可能会感到困惑,注入不会发生.

这是否意味着如果我有几个相同类型的字段我不能只模拟其中一个而是应该@Mock所有相同类型的字段定义?是否已知限制,是否有任何原因尚未解决?@Mock按字段名称匹配应该是直截了当的,不是吗?

java unit-testing inject mockito

16
推荐指数
1
解决办法
8260
查看次数

PowerMock,EasyMock和Mockito框架有什么区别?

我是模拟框架的新手,我的工作需要模拟框架来完成单元测试.在当前的代码库中,我可以看到上面3个框架正在不同的地方用于单元测试.那么,我应该在上述3个框架中选择哪一个?

junit easymock mockito powermock

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

模拟Mockito 2的最后一堂课

我正在从我正在进行的项目中删除Powermock,所以我试图仅用Mockito(mockito-core-2.2.28)重写一些现有的单一测试.

当我运行测试时,我有以下错误:

org.mockito.exceptions.base.MockitoException:

不能模拟/间谍类com.ExternalpackagePath.Externalclass

Mockito不能嘲笑/间谍,因为:

  • 最后一堂课

我知道,这个问题已经被问(如何嘲弄与一的Mockito final类,调用final类与静态的Mockito方法Mock对象),但我没有找到我要找的答案.

这是我的代码的摘录:

public class MyClassToTest extends TestCase {
    private MyClass myClass;
    @Mock private Externalclass ext;  // This class is final, I would like to mock it

    @Override
    protected void setUp() throws Exception {
        MockitoAnnotations.initMocks(this); // <<<< The exception is thrown here
        ext = Mockito.mock(Externalclass.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于文档的Mockito中提到(https://github.com/mockito/mockito/wiki/What%27s-new-in-Mockito-2,§Mock的unmockable),我增加了org.mockito.plugins.MockMaker文件.这是我项目的树:

  • 项目
    • SRC
      • com.packagePath.myPackage
        • 我的课
    • 测试
      • com.packagePath.myPackage
        • myClassToTest
      • 资源
        • 的Mockito的扩展
          • org.mockito.plugins.MockMaker

我还尝试将"resources"目录放在"src"中,在一个名为"test"的子目录中,但结果仍然相同.

我认为用Mockito v2嘲笑决赛是可能的.有人知道这里缺少什么吗?

谢谢!

java unit-testing mockito

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