【问题标题】:To mock the object of other class and return the value expected using Junit in Spring Boot在 Spring Boot 中使用 Junit 模拟其他类的对象并返回预期的值
【发布时间】:2017-09-14 14:42:41
【问题描述】:

我想测试下面的类示例:

public class Sample{
    public boolean sampleMethod(){
        SequenceCreate seq = new SequenceCreate();
        .... //Code where seq is used
     }
}

SequenceCreate 是另一个创建的类,如下所示:

 public class SequenceCreate {
      public String nextSeq() {
      SecureRandom random = new SecureRandom();
      int number = random.nextInt(1000000);
      return String.format("%06d", number);
 }
}

我的测试类如下:

@SpringBootTest(classes = TfaApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class SampleTest{

    @Autowired
    private Sample sample;

    @Mock
    private SequenceCreate seq;

    public void sampleMethodtest(){
          when(sample.nextSeq()).return("123");
          assertTrue(Boolean.True,sample.sampleMethod());
   }
 }

这不起作用。并且断言失败。 通过调试几个小时,我发现每当调用方法 someMethod() 时都会生成序列号,而不是采用模拟值。

我该怎么做?

提前致谢

【问题讨论】:

  • 您应该说明您使用的模拟框架。 assertTrue(Boolean.True,sample.sampleMethod()); 也总是会失败,因为第一部分是 message 而第二部分是布尔条件,它必须返回 truefalse 并且你的方法只返回一个字符串而不是布尔值。你必须这样做:assertTrue("test was successful",sample.sampleMethod().equals("123"));

标签: java spring unit-testing junit


【解决方案1】:

这不起作用,因为您在 sampleMethod() 内手动创建 SequenceCreate 对象。

您可以将 SequenceCreate 设为实例字段并添加一个公共 setter 操作系统,您可以注入该依赖项并正确模拟:

public class Sample{

    private SequenceCreate seq;

    public boolean sampleMethod(){
        .... //Code where seq is used
     }

    public void setSeq(SequenceCreate seq){
       this.seq=seq;
    }
}

那么在你的测试中你会这样做:

@SpringBootTest(classes = TfaApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class SampleTest{

    @Autowired
    private Sample sample;

    @Mock
    private SequenceCreate seq;

    public void sampleMethodtest(){
          sample.setSeq(seq);
          when(seq.nextSeq()).thenReturn("123");
          assertTrue(Boolean.True,sample.sampleMethod());
   }
 }

顺便说一句,您还嘲笑了错误的对象。在when 方法中使用的应该是seq.nextSeq()

【讨论】:

  • 我试过了......但在 sampleMethod() 中创建的 seq 仍然不同
  • 应该是 thenReturn 而不是 return。再试一次。 sampleMethod 方法内部发生的事情也很重要.. 因为这没有发布
【解决方案2】:

你把事情复杂化了。首先你是对Sample进行单元测试,所以Spring Boot与它无关。

其次,当您应该模拟 SequenceCreate 方法时,您的代码正在模拟 Sample。

让你的课

@RunWith(MockitoJUnitRunner.class)

创建一个 SequenceCreate 的模拟

@Mock
private SequenceCreate seq

创建一个新的 Sample 实例

@InjectMocks
private Sample sample;

记录你想要模拟的方法的期望

when(seq.nextSeq()).thenReturn("123");

做你的断言。

assertTrue(Boolean.True,sample.sampleMethod());

【讨论】:

  • 谢谢回复.. 我试过这个.. 但还是没有运气.. 如果你们有好的链接可以在这里分享。我可能会尝试理解..所以我会知道我是否做错了什么
猜你喜欢
  • 2018-03-09
  • 1970-01-01
  • 2018-10-17
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
相关资源
最近更新 更多