2015-05-25 4 views
2

Я хотел бы программно вызывать testng. Не подключаемый модуль eclipse.Получение «java.lang.NoClassDefFoundError: com/beust/jcommander/ParameterException» Исключение

я связан "TestNG-6.8.21.jar" и проходит через затмение и я побежал ниже код:

import org.testng.TestNG; 

public class SampCls 
{ 
     public static void main(String[] args) 
     { 
      TestNG test=new TestNG(); 
     } 
} 

Получение ниже исключения. Как я могу преодолеть это исключение.

Exception in thread "main" java.lang.NoClassDefFoundError: com/beust/jcommander/ParameterException 
    at SampCls.main(SampCls.java:12) 
Caused by: java.lang.ClassNotFoundException: com.beust.jcommander.ParameterException 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    ... 1 more 

ответ

1

Изменить:

Class cls = Class.forName("TestSuite.TestCases.AddContactHappyPath").getClass(); 
test.setTestClasses(new Class[] { cls }); 

По:

test.setTestClasses(new Class[] { AddContactHappyPath.class }); 

Весь код

import org.testng.TestNG; 
import com.xxx.test.others.AddContactHappyPath; 

public class SampCls { 
    public static void main(String[] args) throws ClassNotFoundException { 
     TestNG test = new TestNG(); 
     test.setTestClasses(new Class[] { AddContactHappyPath.class }); 
     test.run(); 
    } 
} 

код TestNG является:

import org.testng.annotations.*; 

public class AddContactHappyPath { 

    @Test() 
    public void AddContactHappyPathTest() { 
     System.out.println("hello world"); 
    } 
} 

консоль Результат:

[TestNG] Running: 
    Command line suite 

hello world 

=============================================== 
Command line suite 
Total tests run: 1, Failures: 0, Skips: 0 
=============================================== 
+0

Как и в пакете существует класс, я полагаю, мы должны обеспечить полный путь Class.forName («TestSuite.TestCases.AddContactHappyPath») и ниже работал для меня: test.setTestClasses (новый класс [] { Class.forName ("TestSuite.TestCases.AddContactHappyPath")}); – Uday

+0

Я обновляю код с помощью testNG в другом пакете. Я добавляю импорт com.xxx.test.others.AddContactHappyPath; – sgrillon

9

Если вы используете проект Maven, вам нужно добавить Зависимость от:

<dependency> 
    <groupId>com.beust</groupId> 
    <artifactId>jcommander</artifactId> 
    <version>1.48</version> 
</dependency> 

класс ком/Бойст/jcommander/ParameterException находится внутри

Если вы используете проект без Maven вам необходимо добавить этот файл jar в свой путь к классу:

jcommander-1.48.jar 

Вы можете скачать этот файл фляги на central.maven.org -> jcommander-1.48.jar

+0

Как я уже упоминал, я ничего не использую.Я только что загрузил эту банку, запустил eclipse, ссылался на эту банку в пути сборки и написал выше 3 строки кода. Когда я запускаю @Test public void hello() {Syso ("hello")}, он работает нормально. Но когда я вызываю testng программно, это бросает это исключение. – Uday

+0

import org.testng.TestNG; Открытый класс SampCls { public static void main (String [] args) { TestNG test = new TestNG(); } } в порядке, можете ли вы предоставить весь код, пожалуйста? – sgrillon

+0

Некоторые, как теперь мой тест не вызывается, Можете ли вы мне помочь? import org.testng.TestNG; общественного класса SampCls { \t \t государственной статической силы основных (String [] арг) бросает ClassNotFoundException \t \t { \t \t \t TestNG тест = новый TestNG(); \t \t \t Класс cls = Class.forName ("TestSuite.TestCases.AddContactHappyPath"). GetClass(); \t \t \t test.setTestClasses (новый класс [] {cls}); \t \t \t test.run(); \t \t} } Следующий мой тест. что мне не хватает: пакет TestSuite.TestCases; import org.testng.annotations. *; общественный класс AddContactHappyPath { \t @Test() \t общественных недействительный AddContactHappyPathTest() \t { \t \t System.out.println ("привет мир"); \t}} – Uday

0

Как @sgrillon правильно указала, что вам нужна правильная зависимость Maven, но и тень плагина (https://maven.apache.org/plugins/maven-shade-plugin) для упаковки Uber-jar, включая все зависимости Maven для легкого выполнения. Это то, что должно быть включено в вашем pom.xml:

... 
    <dependencies> 
    <dependency> 
     <groupId>com.beust</groupId> 
     <artifactId>jcommander</artifactId> 
     <version>1.48</version> 
    </dependency> 
    </dependencies> 
... 
    <plugins> 
     ... 
     <plugin> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>3.1</version> 
     <configuration> 
      <source>1.8</source> 
      <target>1.8</target> 
     </configuration> 
     </plugin> 

     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>2.3</version> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <shadedArtifactAttached>true</shadedArtifactAttached> 
       <shadedClassifierName>runnable</shadedClassifierName> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 

    </plugins> 

После сборки пакета Maven, вы получите ваш обычный my-app-1.0-SNAPSHOT.jar файл, а также в my-app-1.0-SNAPSHOT-runnable.jar. Это то, что вы должны работать с командой:

$ java -jar my-app-1.0-SNAPSHOT-runnable.jar 

Вы можете проверить с помощью этой команды:

$ jar tvf my-app-1.0-SNAPSHOT-runnable.jar 

, что заштрихованная баночка содержит классы JCommander (и те из всех других зависимостей Maven), а обычный - нет.

Смежные вопросы