Java 在Spring Boot中使用Junit模拟其他类的对象并返回预期值

Java 在Spring Boot中使用Junit模拟其他类的对象并返回预期值,java,spring,unit-testing,junit,Java,Spring,Unit Testing,Junit,我想测试下面的类示例: public class Sample{ public boolean sampleMethod(){ SequenceCreate seq = new SequenceCreate(); .... //Code where seq is used } } SequenceCreate是另一个创建的类,如下所示: public class SequenceCreate { public String nex

我想测试下面的类示例:

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());
   }
 }
我的测试课程如下:

 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(),都会生成序列号,而不是采用模拟值

我该怎么做


提前感谢

当您在
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()中手动创建
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()

你把它复杂化了。首先,您是单元测试示例,所以Spring Boot与此无关

其次,当您应该模拟SequenceCreate方法时,您的代码是模拟示例

上课

@RunWith(MockitoJUnitRunner.class)
创建SequenceCreate的模拟

@Mock
private SequenceCreate seq
创建示例的新实例

@InjectMocks
private Sample sample;
记录要模拟的方法的期望值

when(seq.nextSeq()).thenReturn("123");
做你的断言

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

你把事情复杂化了。首先,您是单元测试示例,所以Spring Boot与此无关

其次,当您应该模拟SequenceCreate方法时,您的代码是模拟示例

上课

@RunWith(MockitoJUnitRunner.class)
创建SequenceCreate的模拟

@Mock
private SequenceCreate seq
创建示例的新实例

@InjectMocks
private Sample sample;
记录要模拟的方法的期望值

when(seq.nextSeq()).thenReturn("123");
做你的断言

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

您应该说明您使用的模拟框架。另外
assertTrue(Boolean.True,sample.sampleMethod())
总是会失败,因为第一部分是
消息
,第二部分是布尔条件,必须返回
true
false
,并且您的方法只返回字符串而不是布尔值。您必须这样做:
assertTrue(“测试成功”,sample.sampleMethod().equals(“123”)您应该说明您使用的模拟框架。另外
assertTrue(Boolean.True,sample.sampleMethod())
总是会失败,因为第一部分是
消息
,第二部分是布尔条件,必须返回
true
false
,并且您的方法只返回字符串而不是布尔值。您必须这样做:
assertTrue(“测试成功”,sample.sampleMethod().equals(“123”)