(1) AssertEquals(HttpStatus.OK, httpResponseMessage.getStatus());
Это код теста:
Код: Выделить всё
package com.itstyringsmartsales;
import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.HttpResponseMessage.Builder;
import java.net.URI;
import java.util.*;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Unit test for Sales class.
*/
public class SalesTest {
/**
* Unit test for HttpTriggerJava method.
*/
@Test
public void testHttpTriggerJava() throws Exception {
// implementer execution context interfacet
ExecutionContext testContext = new ExecutionContextInstance();
Logger logger = testContext.getLogger();
// - [x] få til logging.
Level infoLevel = Level.INFO;
logger.log(infoLevel, "Inside test");
Sales mockSale = mock(Sales.class);
// mock formbody
FormParser mockFormParser = mock(FormParser.class);
FormData formdata = new FormData();
String formBody = formdata.formBody;
mockFormParser.formBody = formBody;
HttpRequestMessage request = new HttpRequestMessage() {
@Override
public URI getUri() {
// TODO Auto-generated method stub
return null;
}
@Override
public Builder createResponseBuilder(HttpStatusType status) {
// TODO Auto-generated method stub
return null;
}
@Override
public HttpMethod getHttpMethod() {
// TODO Auto-generated method stub
return null;
}
@Override
public Map getHeaders() {
// TODO Auto-generated method stub
return null;
}
@Override
public Optional getBody() {
// TODO Auto-generated method stub
return Optional.empty();
}
@Override
public Map getQueryParameters() {
// TODO Auto-generated method stub
return null;
}
@Override
public Builder createResponseBuilder(HttpStatus status) {
// TODO Auto-generated method stub
return null;
}
};
System.out.println("Executing mockSale function:");
// this is null
HttpResponseMessage httpResponseMessage = mockSale.run(request, testContext);
System.out.println("httpResponseMessage: " + httpResponseMessage);
System.out.println("Finished executing mockSale function.");
// the test fails because httpResponseMessage.getStatus() cannot run due to httpResponseMessage being null.
assertEquals(HttpStatus.OK, httpResponseMessage.getStatus());
assertEquals(HttpStatus.BAD_REQUEST, httpResponseMessage.getStatus());
}
}Нулевая ошибка возникает, поскольку метод run возвращает значение NULL в (2).
(2) HttpResponseMessage httpResponseMessage =ockSale.run(request, testContext);
Очевидно, что метод run возвращает значение null вот и это основная причина проблемы с этим тестом. По сути, ложная версия класса Sales пытается вызвать метод run, но вместо этого возвращает значение null и терпит неудачу. Вот код бита, который не работает:
public class Sales {
/**
* Эта функция прослушивает конечную точку "/api/Sales". Два способа вызвать его с помощью команды «curl» в bash:
* 1. Curl -d «HTTP Body» {ваш хост}/api/Sales
* 2. Curl {ваш хост}/api/ Продажи?name=HTTP%20Query
**/
Код: Выделить всё
@FunctionName("Sales")
public HttpResponseMessage run(
@HttpTrigger(
name = "req",
methods = {HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage request,
@RequestParameterMap
final ExecutionContext context) {
context.getLogger().info("Java HTTP trigger processed a request.");
System.out.println("Executing Sales function");
Logger logger = context.getLogger();
Level infoLevel = Level.INFO;
String formBody = request.getBody().orElse("");
logger.log(infoLevel, "Executing Sales function");
logger.log(infoLevel, "Formbody: " + formBody + " (in run function)");
// - [x] trigger stored procedure with parsed data as parameters
String connectionString = "jdbc:sql:db03hostingservices.no,55620";
String username = "sa";
String password = "Melkerull27";
FormParser formParser = new FormParser(formBody);
try (Connection connection = DriverManager.getConnection(connectionString, username, password)) {
System.out.println("connection.isValid(0) = " + connection.isValid(0));
// use parameters to avoid SQL injection
PreparedStatement preparedStatement = connection.prepareStatement("EXEC AddSale @product_name= ? @production_cost= ? @price= ? @units_sold= ? @profit= ? @date= ? @month_number= ? @year= ? @indirect_costs= ?");
preparedStatement.setString(1, formParser.getProductName());
preparedStatement.setInt(2, formParser.getProductionCost());
preparedStatement.setFloat(3, formParser.getPrice());
preparedStatement.setInt(4, formParser.getUnitsSold());
preparedStatement.setFloat(5, formParser.getProfit());
preparedStatement.setString(6, formParser.getDate());
preparedStatement.setInt(7, formParser.getMonthNumber());
preparedStatement.setInt(8, formParser.getYear());
preparedStatement.setFloat(9, formParser.getIndirectCosts());
preparedStatement.executeUpdate();
preparedStatement.close();
connection.commit();
connection.close();
} catch (SQLException e) {
System.out.println("Exception occured: failed to parse form data");
context.getLogger().severe("Failed to parse form data: " + e.getMessage());
// Why is this line null?
HttpResponseMessage httpResponseMessage = request.createResponseBuilder(HttpStatus.BAD_REQUEST)
.body("Invalid form data")
.build();
System.out.println("Http responseMessage: " + httpResponseMessage);
return httpResponseMessage;
}
System.out.println("Data was parsed successfully");
// And this one.
HttpResponseMessage httpResponseMessage = request.createResponseBuilder(HttpStatus.OK).body(formBody).build();
System.out.println("Http responseMessage: " + httpResponseMessage);
return httpResponseMessage;
}
Код: Выделить всё
INFO]
[INFO] Results:
[INFO]
[ERROR] Errors:
[ERROR] SalesTest.testHttpTriggerJava:98 NullPointer Cannot invoke "com.microsoft.azure.functions.HttpResponseMessage.getStatus()" because "httpResponseMessage" is null
[INFO]
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0
[INFO]
[INFO] --------------Итак, подведем итог моей проблеме. У меня есть класс Sales, который я хочу протестировать с помощью Mockito и JUnit, но это не удается, поскольку переменная имеет значение NULL. Я хотел бы узнать, как можно решить эту проблему. Можно ли заставить метод, который выполняется на имитируемом объекте Sale, возвращать что-то отличное от null.
Вопрос сводится к следующей переменной, хранящей нулевое значение значение:
Код: Выделить всё
HttpResponseMessage httpResponseMessage = mockSale.run(request, testContext);Подробнее здесь: https://stackoverflow.com/questions/793 ... tion-fails
Мобильная версия