2016-09-07 61 views
2

這是我第一次使用JUnit。我嘗試使用參數進行測試。我有代碼:如何導入Java類中的JunitParamsRunner

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.Parameterized; 

import static org.junit.Assert.assertEquals; 

@RunWith(JUnitParamsRunner.class) 
public class MoneyParameterizedTest { 
    private static final Object[] getMoney() { 
     return new Object[] { 
       new Object[] {10, "USD"}, 
       new Object[] {20, "EUR"} 
     }; 
    } 
    @Test 
    @Parameterized.Parameters(method = "getMoney") 
    public void constructorShouldSetAmountAndCurrency(
      int amount, String currency) { 
     Money money = new Money(amount, currency); 
     assertEquals(amount, money.getAmount()); 
     assertEquals(currency, money.getCurrency()); 
    } 
} 

IntelliJ告訴我:無法解析符號JUnitParamsRunner和方法。導入有問題嗎?我正在測試的課程是在同一個包中。

----- 編輯 -------

我改變JunitParamsrunner.class到Parameterized.class和它的好,但與符號「方法」問題Parametrized.Parameters是一樣的。

回答

2

JUnitParamslicensed Apache 2.0)是一個單獨的庫,這意味着它不隨JUnit本身一起提供。這也意味着你需要確保它在你的項目的類路徑中。如果你使用的是maven(或類似的東西),那麼它很容易,你只需要將它作爲依賴添加到你的pom中,並確保IJ已經接受了更改(如果顯示彈出窗口右上角):

<dependency> 
    <groupId>pl.pragmatists</groupId> 
    <artifactId>JUnitParams</artifactId> 
    <version>1.0.5</version> 
    <scope>test</scope> 
</dependency> 

否則,download it yourself(點擊Download (JAR)鏈接)和library到您的類路徑中。

請注意,儘管概念相似,ParameterizedJUnitParams不是一回事,後者試圖簡化和改進您可以編寫參數化JUnit測試的方式。

P.S:還有一個叫Zohhak庫,這似乎甚至比JUnitParams更靈活,但是它的LGPL 3.0下釋放,這取決於你的許可限制。

+0

你能告訴我這是Maven和「經典」的Java項目相同的下載?相同的JAR? –

+0

@ J.Carrer它是同一個jar文件,不同之處在於maven(gradle等)自動完成這些工作,讓你的生活變得更簡單,依賴,構建等等 – Morfic

0

下面是應該工作的例子:

import junitparams.JUnitParamsRunner; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
//import org.junit.runners.Parameterized.Parameters; 
import static org.junit.Assert.assertEquals; 
import junitparams.Parameters; 

@RunWith(JUnitParamsRunner.class) 
public class MoneyTest { 

    private final static int VALID_AMOUNT = 5; 
    private final static String VALID_CURRENCY = "USD"; 

    private static final Object[] getInvalidAmount() { 
     return new Integer[][] {{-12387}, {-5}, {-1}}; 
    } 

    @Test(expected = IllegalArgumentException.class) 
    @Parameters(method = "getInvalidAmount") 
    public void constructorShouldThrowIAEForInvalidAmount(int invalidAmount){ 
     new Money(invalidAmount, VALID_CURRENCY); 
    } 

    private static final Object[] getInvalidCurrency(){ 
     return new String[][]{{null}, {""}}; 
    } 

    @Test(expected = IllegalArgumentException.class) 
    @Parameters(method = "getInvalidCurrency") 
    public void constructorShouldThrowIAEForInvalidCurrency(String invalidCurrency){ 
     new Money(VALID_AMOUNT, invalidCurrency); 
    } 

    private static final Object[] getMoney() { 
     return new Object[] { 
       new Object[] {10, "USD"}, 
       new Object[] {20, "EUR"} 
     }; 
    } 
    @Test 
    @Parameters(method = "getMoney") 
    public void constructorShouldSetAmountAndCurrency(
      int amount, String currency) { 
     Money money = new Money(amount, currency); 
     assertEquals(amount, money.getAmount()); 
     assertEquals(currency, money.getCurrency()); 
    } 
}