2013-09-24 3 views
1

Так что у меня есть эта ошибка, используя Robolectric.RobolectricTestRunner, класс испытаний может иметь только один конструктор

 
java.lang.IllegalArgumentException: Test class can only have one constructor 
    at org.junit.runners.model.TestClass.(TestClass.java:40) 
    at org.junit.runners.ParentRunner.(ParentRunner.java:75) 
    at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:57) 
    at org.robolectric.RobolectricTestRunner$HelperTestRunner.(RobolectricTestRunner.java:626) 
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:198) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:177) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) 
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) 
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) 

Если быть честным, это сработало несколько недель назад, но после нескольких изменений в моем проекте это сломалось. Я использую версию платформы 4.3_r1. Обычные тесты JUnit хорошо работают.

Тест Класс:

 
@RunWith(RobolectricTestRunner.class) 
public class PreferenceTest 
{ 
    @Before 
    public void setUp() 
    { 
     RoboGuice.setBaseApplicationInjector(Robolectric.application, RoboGuice.DEFAULT_STAGE, 
       Modules.override(RoboGuice.newDefaultRoboModule(Robolectric.application)) 
         .with(new CoreConfigModule())); 
    } 

    @Test 
    public void testSessionTokenPrefs() 
    { 
     InternalPreferences.setSessionToken("abcd1234"); 
     assertThat(InternalPreferences.getSessionToken()).isEqualTo("abcd1234"); 

     InternalPreferences.clearSessionToken(); 
     assertThat(InternalPreferences.getSessionToken()).isNull(); 
    } 
} 
+0

Я не уверен. Robolectric работает непосредственно с загрузчиком классов. Возможно, эта комбинация (Robolectric & RoboGuice) добавляет еще один конструктор в класс –

ответ

1

Так из истории СВЕН, казалось, что тест после того, как я переименовал тестовый пакет.

Я только что переименовал его, но не его предыдущее имя и его работу снова. Я не знаю, что происходит в точности, но, по крайней мере, мои тесты запущены.

0

Похоже, Вы пропусканием класс junit.framework.TestSuite.class к JUnitCore.runClasses(). JUnitCore.runClasses пытается создать экземпляр класса. Для того, чтобы избежать проблем, он требует, чтобы любой класс, который вы передаете имеет только один конструктор

Вы также можете проверить это обсуждение для более подробной информации, link1, link2, link3

+1

У меня нет конструктора в моем отказоустойчивом классе. Это было первое, что я проверил. Я тоже пытался с явным пустым конструктором. – jakk

0

В моем случае это происходит из-за того, что я помещал повторяющиеся слова в имя моего пакета. Это что-то вроде:

au.com.andoroid.com.android 

После того, как я переименовал этот пакет с чем-то, что не имеет дублирования, то он работает отлично.