Code Monkey home page Code Monkey logo

jdt2famix's Introduction

This project offers the mechanism for producing MSE files out of Java code. It is based on JDT Core and Fame for Java, and it requires Java 8.

Build Status Coverage Status

Overview

Installation

Run a release

  1. Download a binary release
  2. The downloaded folder contains all jar files and a jdt2famix.sh script (jdt2famix.cmd for Windows)

Create a binary release from sources

  1. Clone or download this repository
  2. Make sure you have Maven installed and that mvn is in the execution path (i.e., change $PATH)
  3. Execute in the root folder: release.sh
  4. This created a ./release folder that includes all jar files and a jdt2famix.sh script (jdt2famix.cmd for Windows)

How to create an MSE model from a target system

Suppose you have a mysystem root folder in which you have the sources and all jar dependencies of your target Java system.

After having created the release, go to mysystem, and execute /path/to/jdt2famix.sh (/path/to/jdt2famix.cmd for Windows). This will result in an MSE file named like the folder of your target system (in our case mysystem.mse).

You can now import the mysystem.mse file into Glamorous Toolkit.

The importance of including external dependencies

It is important to have all external dependencies in a subfolder of mysystem. This ensures that the importer can correctly identify dependencies to outside entities. Consider the following example of a class definition

@ExternalAnnotation
public class MyClass extends ExternalClass { ... }

In order to describe completely MyClass, we need to extract information about all its immediate dependencies. For example, in our case we need to have information about ExternalClass and @ExternalAnnotation. That is why, we need to have the external libraries available in the Classpath of the importer. As the importer automatically retrieves all jars/ears/wars from the root folder of mysystem, it is enough to place these dependencies somewhere under that folder.

A note about Maven projects

If you happen to have a Java project that defines dependencies through Maven, you can use the following command to copy all dependencies:

mvn dependency:copy-dependencies -DoutputDirectory=dependencies -DoverWriteSnapshots=true -DoverWriteReleases=false

A note about Gradle projects

If you happen to have a Java project that defines dependencies through Gradle, you can take the following steps to create the MSE model:

  1. In your project's build.gradle file include the build.gradle file from jdt2famix instalation:

     apply from: "../jdt2famix/build.gradle"
    
  2. In your project folder use the following command:

     gradle famix
    

Understanding import problems through logging

jdt2famix logs the problems encountered during import.

These problems do not stop the import, but they do lead to loss of information quality in the model. These problems are typically due to missing jars in the classpath, and if you know which parts are problematic, you get a chance of fixing them.

To give you an example, entries might look like this:

unresolved type declaration - TestPlatform - .../jdt2famix/tmp/guava/guava-tests/test/com/google/common/math/TestPlatform.java - line 21
unresolved method declaration - suite - .../jdt2famix/tmp/guava/guava-tests/test/com/google/common/primitives/ByteArrayAsListTest.java - line 51

For example, in the case of guava, importing just the checked out code, gives us 419 problems, most of which were method declaration problems (due to unknown return types). However, after downloading all jars from the maven dependencies, we got only 47 problems (only type declaration problems, but no more method declaration problems). Interestingly, guava is made out of several sub-projects, and these problems appear if we import the overall project. But, if we import only a subproject at a time, the problems do not appear anymore, so likely the issue is related to conflicting jars, or duplicated sources.

License

jdt2famix's People

Contributors

dependabot[bot] avatar ducasse avatar georgeganea avatar girba avatar lasserafn avatar liviuarln avatar rainerwinkler avatar rbonifacio avatar rillig avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jdt2famix's Issues

Text of comments is cut

Some code comments are cut and the text is not full in the model.
E.g.:
Parsing of (always in the https://github.com/awillemant/puho git repo):

class FrancePublicHolidayService {
   List<LocalDate> getPublicHolidaysByYear(final int year) {
    ....
    }


    //thanks to http://www.aveol.fr/?p=602
    private LocalDate getLundiPaques(final int year) {

    }

}

Give a comment with only // instead of //thanks to http://www.aveol.fr/?p=602

lombok compatibility

If the project which is being processed is using lombok (https://projectlombok.org/), the jdt2famix.sh needs to be extended. Otherwise, the stuff generated by lombok is not available when parsing and exceptions occur.

The last line would be like this:
java -javaagent:lombok-X.XX.X.jar=ECJ -cp "$BASE_PATH/*:$BASE_PATH" com.feenk.jdt2famix.injava.Main

Also, make sure the lombok jar in available (e.g. put it in the folder from which you call jdt2famix.sh).

Problems including external dependencies

Tried to parse the attached source code, the parser didnt recognise all the
attributes so I included the rt.jar dependency directly in the bank root folder
which still leads to the same import problems.
thanks in advance
bank.zip

Invalid MSE produced on Windows

When jdt2famix 1.0.3 is used on Windows on AgroUML project to produce MSE, the resulting MSE cannot be parsed.

Steps to reproduce on Windows 10 64bit:

  1. Download libraries and sources of AgroUML and Moose according to instructions on http://themoosebook.org/book/index.html
  2. Download jdt2famix-bin-1.0.3.zip (instead of 1.0.2 presented in the Moose book)
  3. Produce MSE using jdt2famix.cmd
  4. Load MSE into Moose panel

In the middle of parsing the MSE, exception UTF8InvalidText occurs.

  • If the MSE is created on Windows 10 (other Windows version not tested), it cannot be loaded to Moose on any platform
  • If the MSE is created on Linux using jdt2famix.sh, it is loadable on Windows
  • If the Windows-generated not working file is opened using Sublime Text (which reports it is UTF-8) and then "saved with encoding" UTF-8, the result becomes parseable in Moose

Non-Unicode characters in comments break model loading in Moose

Moose seems to not be able to handle non-Unicode characters. An example is when Umlaut characters (ä, ü, ö) appear in a comment. The model created in this case by jdt2famix cannot be loaded in Moose. An example of MSE snippet which breaks model loading ist this:

    (FAMIX.Comment (id: 346)
        (container (ref: 84774))
        (content '/** 
 * Umlaute dürfen nicht benutzt werden.
 */

Although such characters should not be used in source code files, they sometimes are.
If this is to be supported, I am not sure where: in jdt2famix (replace the characters, e.g. ü through ue or remove it altogether) or in moose.

However, in my case removing the Umlaut made the model loadable in Moose.

Process android 'aar' libraries

In Android the java classes are bundled inside an aar zip archive ... it should be easy to unpack it and use the included 'classes.jar' or 'classes[X].jar' for multidex, as the input for processing. This helps to reduce manual or automated steps to extract the aars.

Windows paths are not escaped correcly

I tried the parser under Windows with Mingw, succeeded to compile it with maven, but, and I have the following issue:
/d/TestsExperiements/jdt2famix/release/jdt2famix.sh
jdt2famix - parsing started - D:\myproject
jdt2famix - importing - D:\TestsExperiements\myproject\common-services\src\main\java\com\container\Helper.java
Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 4
^D:\myproject/
^
at java.util.regex.Pattern.error(Unknown Source)
at java.util.regex.Pattern.escape(Unknown Source)
at java.util.regex.Pattern.atom(Unknown Source)
at java.util.regex.Pattern.sequence(Unknown Source)
at java.util.regex.Pattern.expr(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at java.util.regex.Pattern.(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at java.lang.String.replaceFirst(Unknown Source)
at com.feenk.jdt2famix.injava.InJavaImporter.createSourceAnchor(InJavaImporter.java:781)
at com.feenk.jdt2famix.injava.AstVisitor.visit(AstVisitor.java:122)
at org.eclipse.jdt.core.dom.TypeDeclaration.accept0(TypeDeclaration.java:453)
at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2711)
at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:2782)
at org.eclipse.jdt.core.dom.CompilationUnit.accept0(CompilationUnit.java:212)
at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2711)
at com.feenk.jdt2famix.injava.AstRequestor.acceptAST(AstRequestor.java:17)
at org.eclipse.jdt.core.dom.CompilationUnitResolver.resolve(CompilationUnitResolver.java:1029)
at org.eclipse.jdt.core.dom.CompilationUnitResolver.resolve(CompilationUnitResolver.java:636)
at org.eclipse.jdt.core.dom.ASTParser.createASTs(ASTParser.java:990)
at com.feenk.jdt2famix.Importer.run(Importer.java:32)
at com.feenk.jdt2famix.injava.Main.main(Main.java:25)

Source InJavaImporter.java:781: fileAnchor.setFileName(sourceFilePath.replaceFirst("^"+ignoredRootPath+"/", ""));

the order of method parameters is sometimes incorrect

Sometimes the MSE contains method parameters out of order,

e.g. for method methodName(Type1 parameter1, Type2 parameter2, Type3 parameter3) it produced the following:

(in the order as they appeared in the MSE, with line numbers added:)

[...]
29734:
	(FAMIX.Parameter (id: 5273)
		(name 'parameter3')
		(declaredType (ref: 1236))
		(parentBehaviouralEntity (ref: 10032)))
[...]
50547:
	(FAMIX.Parameter (id: 8995)
		(name 'parameter1')
		(declaredType (ref: 15523))
		(parentBehaviouralEntity (ref: 10032)))
[...]
56409:
	(FAMIX.Method (id: 10032)
		(name 'methodName')
		(astStartPosition 7268)
		(astStopPosition 7284)
		(cyclomaticComplexity 2)
		(modifiers 'private')
		(parentType (ref: 16356))
		(signature 'methodName(Type1, Type2, Type3)'))
[ ... ]
96727:
	(FAMIX.Parameter (id: 17183)
		(name 'parameter2')
		(declaredType (ref: 19939))
		(parentBehaviouralEntity (ref: 10032)))
[...]

The parameters are incorrectly in the order 3,1,2.

I cannot share the source code, but the order changes every time I re-run the importer.

Cannot compile with Java 8

It is no longer possible to compile using java 8.
The following error occurs:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project jdt2famix: Compilation failure
[ERROR] /C:/Users/jpn/Downloads/source/jdt2famix_2/src/main/java/com/feenk/jdt2famix/Importer.java:[33,55] cannot access org.eclipse.core.runtime.Plugin
[ERROR] bad class file: C:\Users\jpn.m2\repository\org\eclipse\platform\org.eclipse.core.runtime\3.24.100\org.eclipse.core.runtime-3.24.100.jar(org/eclipse/core/runtime/Plugin.class)
[ERROR] class file has wrong version 55.0, should be 52.0
[ERROR] Please remove or make sure it appears in the correct subdirectory of the classpath.

It seems that the dependency "org.eclipse.core.runtime" is no longer available for java 8 (version 52.0).

Accesses are not ordered

When defining accesses in a method, there should an order between them.
That is defined through the FAMIXAssociation next and previous methods.

E.g.:
myMethod(){
var1.m1();
var2.m2();
}

defines 2 accesses : (A1)myMethod -> m1 and (A2)myMethod -> m2 with A1.next = A2 and A2.previous = A1

FAMIXReferences in method annotations are not in model

For example:

public class GlobalControllerExceptionHandler {
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler({ NotSupportedCountryException.class, WrongPeriodException.class })
    public String handleException(final Exception ex) {
        return ex.getMessage();
    }
}

references to HttpStatus, NotSupportedCountryExceptionand WrongPeriodExceptionare not linked to method handleException.

Test InnerClassWithMethod fails

java.lang.AssertionError: Values should be different. Actual: 

	at org.junit.Assert.fail(Assert.java:88)
	at org.junit.Assert.failEquals(Assert.java:185)
	at org.junit.Assert.assertNotEquals(Assert.java:161)
	at org.junit.Assert.assertNotEquals(Assert.java:175)
	at com.feenk.jdt2famix.injava.oneSample.InnerClassWithMethod.testMethodsWithNoNameShouldNotBeCreated(InnerClassWithMethod.java:21)

java.lang.AssertionError: Values should be different. Actual: 

	at org.junit.Assert.fail(Assert.java:88)
	at org.junit.Assert.failEquals(Assert.java:185)
	at org.junit.Assert.assertNotEquals(Assert.java:161)
	at org.junit.Assert.assertNotEquals(Assert.java:175)
	at com.feenk.jdt2famix.injava.oneSample.InnerClassWithMethod.testClassesWithNoNameShouldNotBeCreated(InnerClassWithMethod.java:28)

This is typically not found by automatic Maven builds since the maven-surefire-plugin only runs test classes whose name ends with Test.

Define output path for jdt2famix

The output of the invocation of com.feenk.jdt2famix.injava.Main is generated in the current working directory. So if jdt2famix is integrated in a build of a greater project this leads to manually (or scripted) copy the ouput files '.ipr', '.iws' and '*.msi'.
It would be great if the jdt2famix has something like an output path argument like

$jdt2famix --output [PATH]

Accesses in methods of innerclasses are not all in the model and point to nil

It seems that the accesses from the methods in innerclasses are not fully created and the one created has its "to" link pointing to nil.

Method example in a class:

public class ComplexClassWithInnerClassMethod {

public static InnerClassTemplate withTests(Set<Class> argUpperMetho) {
	return new InnerClassTemplate() {
		@Override
		public Set<Class> methodOfInnerClass(Collection<String> arg) {
			// Set<Class> testsToRun = new HashSet<Class>();
			// for (Class<?> each : argUpperMetho) {
			// System.out.println(each);
			// }
			return argUpperMetho;
		}
	};
}

}

Test to come in PR

Namespaces should be nested and not standalone

Namespaces created are not nested in each other:
Namespace: com.apache should have as parent scope the namespace com.

For now namespace "com" is not created. So it should be to resolve this issue

References are not created in the mse

E.g.:

package com.foo;

import org.junit.Test;
public class FooTest {
@test
void test(){
String foo = new String();
}
}

Does not create a reference from FooTest::test() to String

Some accesses are not in model

I took as example the project https://github.com/awillemant/puho commit version 8c29333.

There is this code:
package puho.controller;
public class PublicHolidayControllerTests {
    private MockMvc mockMvc;
    @Autowired
    private WebApplicationContext webApplicationContext;
    @Before
    public void setup() throws Exception {
        this.mockMvc = webAppContextSetup(webApplicationContext).build();
    }
    ....
}

In the model, the method PublicHolidayControllerTests::setup() accesses contain only webApplicationContext and should also contain mockMvc.

Crashes with several Java projects

I'm using the 1.0.12 version under Ubuntu (Windows Subsystem for Linux) for the Guava project and I am getting apparently the same crash reported in 2016.

Exception in thread "main" java.lang.ClassCastException: com.feenk.jdt2famix.model.famix.Enum cannot be cast to com.feenk.jdt2famix.model.famix.Class
	at com.feenk.jdt2famix.injava.AstVisitor.visit(AstVisitor.java:741)
	at org.eclipse.jdt.core.dom.ThrowStatement.accept0(ThrowStatement.java:140)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:2882)
	at org.eclipse.jdt.core.dom.Block.accept0(Block.java:137)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChild(ASTNode.java:2859)
	at org.eclipse.jdt.core.dom.MethodDeclaration.accept0(MethodDeclaration.java:635)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:2882)
	at org.eclipse.jdt.core.dom.AnonymousClassDeclaration.accept0(AnonymousClassDeclaration.java:144)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChild(ASTNode.java:2859)
	at org.eclipse.jdt.core.dom.ClassInstanceCreation.accept0(ClassInstanceCreation.java:314)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChild(ASTNode.java:2859)
	at org.eclipse.jdt.core.dom.ReturnStatement.accept0(ReturnStatement.java:137)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:2882)
	at org.eclipse.jdt.core.dom.Block.accept0(Block.java:137)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChild(ASTNode.java:2859)
	at org.eclipse.jdt.core.dom.MethodDeclaration.accept0(MethodDeclaration.java:635)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:2882)
	at org.eclipse.jdt.core.dom.AnonymousClassDeclaration.accept0(AnonymousClassDeclaration.java:144)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChild(ASTNode.java:2859)
	at org.eclipse.jdt.core.dom.ClassInstanceCreation.accept0(ClassInstanceCreation.java:314)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChild(ASTNode.java:2859)
	at org.eclipse.jdt.core.dom.VariableDeclarationFragment.accept0(VariableDeclarationFragment.java:263)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:2882)
	at org.eclipse.jdt.core.dom.VariableDeclarationStatement.accept0(VariableDeclarationStatement.java:267)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:2882)
	at org.eclipse.jdt.core.dom.Block.accept0(Block.java:137)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChild(ASTNode.java:2859)
	at org.eclipse.jdt.core.dom.MethodDeclaration.accept0(MethodDeclaration.java:635)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:2882)
	at org.eclipse.jdt.core.dom.TypeDeclaration.accept0(TypeDeclaration.java:470)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:2882)
	at org.eclipse.jdt.core.dom.CompilationUnit.accept0(CompilationUnit.java:257)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2811)
	at com.feenk.jdt2famix.injava.AstRequestor.acceptAST(AstRequestor.java:30)
	at org.eclipse.jdt.core.dom.CompilationUnitResolver.resolve(CompilationUnitResolver.java:1035)
	at org.eclipse.jdt.core.dom.CompilationUnitResolver.resolve(CompilationUnitResolver.java:633)
	at org.eclipse.jdt.core.dom.ASTParser.createASTs(ASTParser.java:1003)
	at com.feenk.jdt2famix.Importer.run(Importer.java:44)
	at com.feenk.jdt2famix.injava.Main.main(Main.java:30)

The Guava project has over 30,000 stars on GitHub, making it a very interesting case for empirical studies. I hope jdt2famix can be fixed to work with this project.

Creating anonymous classes inside lambdas leads to error due to null binding

Reported by Domingo:

public interface ParameterizableInterface<T> {
    T invoke(String value);
}

public void methodWithInnerClassInLambdaBlock() {
        ParameterizableInterface<Boolean> c = value -> {
            EmptyClass e = new EmptyClass() {
                @Override
                public boolean equals(Object obj) {
                    return true;
                };
            };
            return e.equals(value);
        };
        c.invoke("string");
    }

Test for EmptyClass failing while building with Maven on Windows 10

I am trying to build jdt2famix from sources on Windows 10 Home, Version 1709, OS Build 16299.431 and I get the following error:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on project jdt2famix: There are test failures.

Output of mvn --version

Apache Maven 3.5.3 (3383c37e1f9e9b3bc3df5050c29c8aff9f295297; 2018-02-24T20:49:05+01:00)
Java version: 1.8.0_172, vendor: Oracle Corporation
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

Output of mvn package

...
Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.04 sec <<< FAILURE!
testSourceAnchor(com.feenk.jdt2famix.injava.oneSample.EmptyClassTest)  Time elapsed: 0.028 sec  <<< FAILURE!
java.lang.AssertionError: expected:<45> but was:<47>
        at org.junit.Assert.fail(Assert.java:88)
        at org.junit.Assert.failNotEquals(Assert.java:743)
        at org.junit.Assert.assertEquals(Assert.java:118)
        at org.junit.Assert.assertEquals(Assert.java:144)
        at com.feenk.jdt2famix.injava.oneSample.EmptyClassTest.testSourceAnchor(EmptyClassTest.java:25)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
        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.junit.runners.ParentRunner.run(ParentRunner.java:309)
        at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
        at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
        at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
        at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
        at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)

How could I fix this problem?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.