我正在爲我的代碼編寫單元測試用例。我正在使用PowerMockito和Junit。我寫了一個初始化代碼,它將處理我應用程序中所有初始化的東西。下面是我的代碼的結構方式:對多個測試類只執行一次初始化代碼
Class ServiceInitializer{
public static isInitialized = Boolean.FALSE;
public static void initialize(){
//Initilization Code Goes Here
isInitialized = Boolean.TRUE;
}
}
@RunWith(PowerMockRunner.class)
class BaseTest{
@Before
public void preTest(){
//some code
}
static{
if(!ServiceInitializer.isInitialized){
ServiceInitializer.initialize();
}
}
@After
public void postTest(){
//some code
}
}
public TestClass1 extends BaseTest{
@Test
public void testMethodA_1(){//test code}
@Test
public void testMethodA_2(){//test code}
@Test
public void testMethodA_3(){//test code}
}
public TestClass2 extends BaseTest{
@Test
public void testMethodB_1(){//test code}
@Test
public void testMethodB_2(){//test code}
@Test
public void testMethodB_3(){//test code}
}
我使用JUnit和batchtest目標執行這些測試案例ant腳本下面給出:
<junit printsummary="yes" haltonfailure="yes" showoutput="yes">
<classpath refid="JUnitTesting.classpath"/>
<batchtest haltonerror="false" haltonfailure="no" todir="${junit.output.dir}/raw">
<formatter type="plain"/>
<formatter type="xml"/>
<fileset dir="${basedir}/src">
<include name="**/Test*.java"/>
</fileset>
</batchtest>
</junit>
我能夠只是執行測試用例很好,但它的初始化代碼寫在了BaseTest類的靜態塊中,這對我造成了問題。每當新測試類別開始執行時,「ServiceInitializer.initialize();」每次都會被調用。所以說,如果我有10個測試類,那麼這個方法會被調用10次。我想要控制它,使得它只能被執行一次,無論我有多少個測試類。我怎樣才能做到這一點?這甚至有可能與JUnit?
--Update--
我知道有可用@BeforeClass
標註這正是一次爲每個測試類執行的代碼塊。但是這並不符合我的要求,因爲一旦JUnit運行其他測試類,就會調用「@BeforeClass」註釋下的方法,並且儘管在那裏進行初始化檢查後再次運行初始化代碼。
謝謝你的真棒迴應。我不確定原因,但初始化代碼沒有執行。然後我從BaseTest類中刪除了「@RunWith(PowerMockRunner.class)」註釋,然後按預期方式執行初始化代碼。你有什麼想法保持它嗎? –
@PrerakTiwari聽起來像'PowerMockRunner'不支持類規則。我建議重構你的代碼,這樣你就不需要powermock,或者在沒有'PowerMockRunner'的情況下使用powermock – NamshubWriter
接受你的答案,但PowerMock不能在沒有PowerMockRunner的情況下使用。因此,爲了完美運行,需要刪除「@RunWith(PowerMockRunner.class)」註釋,並且必須包含「@Rule public PowerMockRule powerMockRule = new PowerMockRule();」 在課堂上。您可以從[此處](https://code.google.com/p/powermock/wiki/PowerMockRule)閱讀更多內容。 –