如何测试班级的方法行为?
public class InfiniteWhileLoop {
public void fun() {
while (true) {
// some code to test
}
}
}
我需要测试方法fun
,并确保将字段设置为" xyz"。问题是我得到一个无限循环。所以我需要运行while循环并让它设置字段,然后停止循环。
有可能吗?
答案 0 :(得分:1)
如果涉及另一个依赖项,则可以使用异常进行转义。
使用Mockito的样本(也可以通过手动伪造依赖性来实现)
public class Foo
{
public interface Bar
{
void doSomething();
}
private Bar bar;
private int counter = 0;
public Foo( Bar bar )
{
this.bar = bar;
}
public void loop()
{
while ( true )
{
counter++;
bar.doSomething();
}
}
public int getCounter()
{
return counter;
}
}
测试:
public class FooTest
{
@SuppressWarnings( "serial" )
private class TestException extends RuntimeException
{}
@Test
public void loop3ShouldIncrementCounterBy3() throws Exception
{
Bar bar = mock( Bar.class );
Foo cut = new Foo( bar );
doNothing().doNothing().doThrow( new TestException() ).when( bar ).doSomething();
try
{
cut.loop();
}
catch ( TestException e )
{}
assertThat( cut.getCounter(), is( 3 ) );
}
}
答案 1 :(得分:0)
while
循环继续,直到条件返回false,因此while(true);
永远无法确定false
值而不是true
。
你可以添加一个break;
,它会在调用时突破循环。像这样:
while(true)
{
String response = testStuff();
if ("Success".equals(response))
{
break;
}
}
然而,通常更清楚的是将条件置于while
循环中 - 这是人们期望条件的位置,并且更容易阅读。像这样:
String response = "Default";
while(!response.equals("Success"))
{
response = testStuff();
}
假设您在另一个更改变量的线程上输入命令。同样的事情适用。请注意,必须在另一个线程上或在while循环内更改它 - 否则永无止境的循环将不允许代码到达其他任何位置。
static String command = "Continue";
while(command.equals("Continue"))
{
testStuff();
}
//I input something which changes command to "Stop"
//The while loop will end *AFTER* it's current run through testStuff() - not immediately.
答案 2 :(得分:0)
我不确定我是否理解你的问题。但是,如果您尝试对您的方法进行单元测试,那么您可以将要测试的代码提取到另一个类,然后测试您创建的新类。
我希望能帮助你。