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”)我试过了。。。但是sampleMethod()中创建的seq仍然不同,应该是thenReturn而不是return。再试一次。sampleMethod内部发生的事情也很重要。。因为这不是postedI我试过了。。。但是sampleMethod()中创建的seq仍然不同,应该是thenReturn而不是return。再试一次。sampleMethod内部发生的事情也很重要。。因为这并不是为了回复而发的。。我试过这个。。但是还是没有运气。。如果你们有好的链接,请在这里分享。我可以试着去理解。。因此,我将知道我是否做了任何其他错误的事情,请回复。。我试过这个。。但是还是没有运气。。如果你们有好的链接,请在这里分享。我可以试着去理解。。所以我会知道我是否做错了什么