I have some classes throughout a maven project. I would like to add a main method to some of those classes for basic testing while developing.
I tried declaring the class to run with:
mvn exec:java -Dexec.mainClass="huru.util.Async"
but that command looked in my pom.xml file and it ran some pre-configured setup and started my server up as usual. How can I run a specific file (not my regular main class), but still load up the necessary dependencies?
note that for testing I need most of the dependencies in pom.xml, so I will probably need mvn to run the class that I need to test, I can't run it directly with javac.
update sadly, I may need to create a profile in pom.xml since maven can't seem to do very much from the command line. I don't know much about profiles and since I have none in my pom.xml file right now, I am a bit scared of adding that section.
As suggested in the comments, one solution is to skip putting a main method in the class I want to test, but instead create a junit test...this works at the command line:
mvn -Dtest=AsyncTest test
where my test looks like:
package huru;
import huru.util.Async;
import io.vertx.core.Vertx;
import io.vertx.ext.unit.TestContext;
import io.vertx.ext.unit.junit.VertxUnitRunner;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Arrays;
#RunWith(VertxUnitRunner.class)
public class AsyncTest {
#Test
public void test(TestContext tc) {
Async.Parallel(Arrays.asList(
v -> {
v.done(null, null);
}
), (e, results) -> {
});
}
}
In my Xpage, I have added to Java classes. One is "AUser" declared in Models package and one is "AUserRepository" declared in a Repository package.
When I try and import AUser into a class in my AUserRepository... the import statement I type in is not working.
import com.Discussion.utils.AUser;
Weird thing is, If I exit out of Notes and load up eclipse standalone, and make the same kind of stuff, the import works fine. Am I missing out some important factor in Xpages?
The problem definitely is the import routing.
import Models.AUser;
import Repository.AUserRepository;
Is the project build path correct? Project - Properties - Java build path. Also, have you tried cleaning the project? Project - Clean....
I just shifted my project form Netbeans to intelliJ IDEA, its a junit based test project. In netbeans I was using statments
assertTrue("Message", conditionCustom());
and it was working without any extra import. Now when using the same above command in intelliJ I have to import file
import static org.junit.Assert.assertTrue;
is there any way so I dont need to write the above line in my code file? otherwise I have to edit all my files to get working assertTrue statement.
You either have to add the static import OR make clear what class that static call is associated with:
Assert.assertTrue("Message", conditionCustom());
I usually use the latter because I think it's clearer.
Java won't compile unless it can figure out which class to associate that static method with.
I'd guess that perhaps you use inheritance to associate that static method with your test.
I Already read this, this and this before posting my question.
My problem is slightly different.
I'm a beginner in java and I have a jar file that I need to use in my project (I beleive it is called library).
I imported it to my netbean libraries folder using import jar/folder option and I can see content of the library. Unfortunately the class that I need to import is under default package and using import rearrange; (rearrange is name of class) is not working.
To understand how to use this class I decompiled a class file that is importing exact same class and surprisingly it uses import rearrange; to import that class.
I know that I cannot import classes from default package. and my sample class is not using reflection either.
What I'm doing wrong and how can I import this class?
I also know that library (jar file) and also my sample class are compiled with java 1.6 (they didn't use 1.3.x that was allowing this type of import)
I want to be able to run all tests in a project programmatically. I know Eclipse has a "Run as JUnit test" configuration which somehow grabs all the tests in a project and run them. Is there any way for me to also grab the list of tests programmatically and run them? Or is there some good way to construct a test suite containing all the test cases without manually listing out every one (all 700+) of them?
I've tried the "New... -> Test Suite" option in Eclipse, but that seems to work only for JUnit 3, identifying tests by their extending from TestCase
The test classes are JUnit 4, so their only distinguishing characteristic is the annotation, no naming convention, no subclassing from TestCase.
Thanks in advance!
Though it does not really solve your immediate problem, I find it a very useful general practice to create suites and suites of suites, e.g. for a package something like PackageFooSuite etc. and assemble these suites in one or more suites again, like ModuleFooSuite and have one top-level suite, like AllTestsSuite. That way it's easy to run both all tests in one step as well as submodule tests for the package I'm currently working on (and have the tests run quicker than if I would always run all of them):
#RunWith(Suite.class)
#Suite.SuiteClasses({ PackageFooSuite.class, PackageBarSuite.class} )
public final class AllTestsSuite {} // or ModuleFooSuite, and that in AllTests
None of the other answers did it for me. I had 40k tests I needed to run, so manually listing every class was not an option.
I did it with ClasspathSuite. A test suite that runs all Junit4 and Junit3 test cases in the class path is as follows:
import org.junit.extensions.cpsuite.ClasspathSuite;
import org.junit.extensions.cpsuite.ClasspathSuite.*;
import org.junit.runner.RunWith;
import org.junit.runner.JUnitCore;
import static org.junit.extensions.cpsuite.SuiteType.*;
#RunWith(ClasspathSuite.class)
#SuiteTypes({ JUNIT38_TEST_CLASSES, TEST_CLASSES })
public class RunAllSuite {
/* main method not needed, but I use it to run the tests */
public static void main(String args[]) {
JUnitCore.runClasses(RunAllSuite.class);
}
}
I needed to run it from command line, so this is what I did:
Downloaded cp-1.2.6.jar
Create the previously mentioned RunAllSuite
Compile the class, javac RunAllSuite.java -cp cpsuite-1.2.6.jar;junit-4.8.1.jar
run it with target tests in the class path, java -cp cpsuite-1.2.6.jar;junit-4.8.1.jar;path/to/runallsuite/folder;target/classes;target/test-classes RunAllSuite
And that's it. With the RunAllSuite above, anywhere in your code you can just do JUnitCore.runClasses(RunAllSuite.class), which runs all tests in class path. There are other config options as well which are explained in the ClasspathSuite home page.
Note also that the class given above does not print anything. If that is needed, you can do
import org.junit.extensions.cpsuite.ClasspathSuite;
import org.junit.extensions.cpsuite.ClasspathSuite.*;
import org.junit.runner.RunWith;
import org.junit.runner.JUnitCore;
import org.junit.internal.TextListener;
import static org.junit.extensions.cpsuite.SuiteType.*;
#RunWith(ClasspathSuite.class)
#SuiteTypes({ JUNIT38_TEST_CLASSES, TEST_CLASSES })
public class RunAllSuite {
public static void main(String args[]) {
JUnitCore junit = new JUnitCore();
junit.addListener(new TextListener(System.out));
junit.run(RunAllSuite.class);
}
}
You can do this fairly easily from within maven using the surefire plugin: I usually clean/compile/install my projects from the command line before comparing them for eclipse usage (mvn eclipse:clean eclipse:eclipse) and you can define a test suite in your pom which lists all the tests you want to run en masse every time you run mvn install. You're not calling them programatically, exactly, but you can certainly call them en masse.
In Eclipse (I'm using 4.6.1) - Right click the project folder, select "Run As", choose "JUnit Test"
It will run all tests in that project. Same for a package.
Of the top of my head using Spring:
Implement a TypeFilter that matches classes with methods annotated with #Test (don't forget to consider the superclasses)
Invoke classpath scanning on your top-most test package
Invoke the JUnitRunner with the scan results
More info on classpath scanning and custom type filters here
With Eclipse Indigo (possibly Helios as well) in the Run Configurations dialog box, you now have the ability to Run all tests in a selected project, package or source folder.
Also a good reference from Eclipse is the article Java Unit testing with JUnit 4.x in Eclipse.
I also recommend using the JUnit Suite annotations. Follow the link for more detail.