Laden einer JAR -Datei in einen Kotlin -Unit -TestJava

Java-Forum
Anonymous
 Laden einer JAR -Datei in einen Kotlin -Unit -Test

Post by Anonymous »

Ich arbeite an einer Kotlin -Anwendung, um Daten an eine Anwendung von Drittanbietern zu senden. Der Anbieter hat eine JAR -Datei zur Verfügung gestellt, die wir ausführen müssen, um die Daten tatsächlich an sie zu übermitteln (für weitere Details: Wie führe ich eine JAR -Datei als Teil einer Kotlin -Anwendung aus?) < /P>
, während ich herausgefunden habe, wie man den JAR -JAVA.lang.lang.Prozesbuster ausführt. Ich wollte einen Test meiner Logik erstellen, der die JAR -Datei aufruft, ohne sich um den Inhalt des eigentlichen Glass kümmern zu müssen. Zu diesem Zweck habe ich eine einfache Java -Klasse erstellt, sie in ein Glas gepackt und dieses Glas dann in SRC/Test/Ressourcen eingebaut. Dieser Eingabestream wird dann in eine TMP -Datei geschrieben. Wenn ich meine Funktion mit dieser TMP -Datei aufrufe, erhalte ich einen solchen Fehler: < /p>

java.lang.Exception: Fehler: Fehler kann nicht auf JARFile zugreifen
Hello152865653829292855962.jar< Nehmen Sie dies um, indem Sie den absoluten Dateipfad und die ursprüngliche (nicht-TMP) Datei an meine Funktion übergeben. Das Problem ist, dass es nur auf meiner lokalen Maschine funktioniert, und ich muss diesen Test mit einer CI -Pipeline kompatibel sein.

Code: Select all

public class Main {
public static void main(String[] args) throws Exception {
//TIP Press  with your caret at the highlighted text
// to see how IntelliJ IDEA suggests fixing it.
System.out.printf("Hello and welcome!");

if( args.length > 1 ) {
throw new Exception("Too many args");
}

for (int i = 1; i 
Meine Kotlin -Funktion zum Ausführen des Glas: < /p>
internal fun executeJavaJar(workingDir:String, jarFile:String, args:List): Either
{
return runCatching {
val cmdArgs: MutableList = mutableListOf("java", "-jar", jarFile)
cmdArgs.addAll(args)
ProcessBuilder(cmdArgs).directory(File(workingDir))
.redirectOutput(ProcessBuilder.Redirect.PIPE)
.redirectError(ProcessBuilder.Redirect.PIPE).start()
}.fold({
it->
val output = IOUtils.toString( it.inputStream, Charsets.UTF_8)
val error = IOUtils.toString( it.errorStream, Charsets.UTF_8)
if(error.isNotEmpty())
{
throw Exception(error)
}
else {
output.right()
}
}, {
error->
error.left()
})
}
< /code>
Mein Unit -Test: < /p>
@Test
fun `test execute java jar`()
{
mockContext(300).value().let { context ->
testInt295DependencyProvider(context).let { dp ->
javaClass.classLoader.getResourceAsStream("HelloTest.jar").use { stream ->

//this works locally but would fail in a CI build
executeJavaJar("/Users/userA/Documents/workspace/app-event-management/lambda-INT295/src/test/resources",
"HelloTest.jar", listOf("abc")).fold({
fail("test execute java jar failed with error: ${it.message}")
}, {
output->
println(output)
assertNotNull(output)
assertThat(output).isNotEmpty
})
}
}
}
}

@Test
fun `test execute java jar with tmp`()
{
mockContext(300).value().let { context ->
testInt295DependencyProvider(context).let { dp ->
javaClass.classLoader.getResourceAsStream("HelloTest.jar").use { stream ->
assertNotNull(stream)
val inputFile = createTempFile(prefix = "hello", suffix = ".jar").toFile()
inputFile.copyInputStreamToFile(stream)

//this throws an access error
executeJavaJar(".",
inputFile.name, listOf("abc")).fold({
fail("test execute java jar failed with error: ${it.message}")
}, {
output->
println(output)
assertNotNull(output)
assertThat(output).isNotEmpty
})
}
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post