如何测试永不返回的方法?

时间:2015-05-05 16:43:10

标签: java unit-testing

如何测试班级的方法行为?

public class InfiniteWhileLoop {
    public void fun() {
        while (true) {
            // some code to test
        }
    }
}

我需要测试方法fun,并确保将字段设置为" xyz"。问题是我得到一个无限循环。所以我需要运行while循环并让它设置字段,然后停止循环。

有可能吗?

3 个答案:

答案 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)

我不确定我是否理解你的问题。但是,如果您尝试对您的方法进行单元测试,那么您可以将要测试的代码提取到另一个类,然后测试您创建的新类。

我希望能帮助你。