【问题标题】:Junit @ Test method, Giving input at runtime [duplicate]Junit @Test方法,在运行时提供输入[重复]
【发布时间】:2018-03-24 06:29:54
【问题描述】:

我课上写的方法

public static Advertisement[] createAd() throws IOException
{
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

    Advertisement[] ad = new Advertisement[5];
    int count =0;
    char ch;
    do
    {
    System.out.println("Enter advertisement id:");
    int id=Integer.parseInt(br.readLine());
    System.out.println("Enter advertisement type:");
    String type=br.readLine();
    ad[count]= new Advertisement(id, type);
    count++;
    System.out.println("Do you want publish another   advertisement(Y/N):");
     ch = br.readLine().charAt(0);

    if((ch!='y')&&(ch!='Y'))
    {
        break;
    }

    }while(count<=5);
    if(count==5)
    {
        System.out.println("Maximum ads reached");
        return ad;
    }
    return ad;
}


Juint @Test method
 @Test
public void testCreateAd() throws IOException
{
    Advertisement[] a = Advertisement.createAd();
    assertTrue("Maximum five ads only should be created",(a.length<=5));
}

我想检查一下,createAd 方法应该返回最多 5 个广告类型的对象。但是当@Test 方法运行时它要求输入,我们可以通过一些地方将输入传递给那些 readLine 方法

【问题讨论】:

  • 要看的东西:stackoverflow.com/a/6416591/1531124。问题是:您可以使用一些技巧测试从 System.in 读取的代码。但是:你不应该这样做。您完全隐藏您的代码通常从您的生产代码中从标准输入读取的事实。以便它适用于任何类型的输入。

标签: java junit


【解决方案1】:

我认为您需要模拟缓冲的阅读器。 您可以将它作为方法参数传递(或创建另一个接受它作为参数的方法,然后在您的测试代码中模拟它。 看看this

【讨论】:

  • 非常感谢。
  • 这确实意味着你解决了?如果是这样,请为下一个用户编写解决方案,或将正确的响应标记为解决方案。
【解决方案2】:

BufferedReader 应该是 private 类成员。如果你这样做,你可以在你的测试类中@Mock这个成员,然后你可以控制它的每次调用和返回值。

@Mock
private BufferedReader bufferedReaderMock;

Mockito.doReturn("some input").when(bufferedReaderMock).readLine();

现在您可以控制和模拟用户可能输入的值。 在你断言之前不要忘记这一点:

Mockito.verify(bufferedReaderMock).readLine(); // Verify it was called
Mockito.verifyNoMoreInteractions(<all mocks)); // verify no other dependency class/member was called.

【讨论】:

  • 它对你有用吗?
  • 是的..我用另一种方法得到相同的..
  • 也许将其作为命令发布,以便其他人也可以使用您的 was。
  • @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream();@Test public void testCreateAdLength() throws IOException { systemInMock.provideLines("3","1", "social","2","媒体","3","笔记本电脑"); assertTrue("应检查数组的长度", Advertisement.createAd().length==3); }
  • 使用 system-rules-1.16.0.jar
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 2012-02-27
  • 1970-01-01
  • 2013-06-18
相关资源
最近更新 更多