java - 如何模拟使用 SLF4J Log4J Logger 的类?

标签 java log4j slf4j powermock

我尝试模拟一个通过 Hibernate 在其他类上实例化 DatabaseConnection 的类,但我在该类中收到 SLF4J 错误工厂的错误,但我希望记录器在此测试中运行。我怎样才能修复这个问题以模拟类,然后成功实例化列表和记录器?

我尝试模拟类(Ingredientadminsitration),然后是这样的:

PowerMockito.mockStatic(LoggerFactory.class);
        when(LoggerFactory.getLogger(any(Class.class))).
                thenReturn(loggerMock);

成分管理.java

@Slf4j
public class Ingredientsadministration {
    private ObservableList<Ingredient> zutaten;
    private SQLConnection sqlConnection;
    private static Ingredientsadministration ingredientsadministration;
    private Logger logger;

    private Ingredientsadministration() {
        logger = LoggerFactory.getLogger(this.getClass());
        connectToDB();
        zutaten = FXCollections.observableArrayList(sqlConnection.getZutaten());

    }

    public static Ingredientsadministration getInstance() {
        if (ingredientsadministration == null) {
            ingredientsadministration = new Ingredientsadministration();
        }

        return ingredientsadministration;
    }

MySQLHibernate.java

@Slf4j
public class MySQLConnectHibernate implements SQLConnection {

    private static SessionFactory sessionFactory;
    private Session session;
    private Logger logger;
    private static MySQLConnectHibernate entity;

    private MySQLConnectHibernate() throws ServiceException {
        logger = LoggerFactory.getLogger(this.getClass());
        setup();
    }
   public static MySQLConnectHibernate getInstance() {
        if (entity == null) {
            entity = new MySQLConnectHibernate();
        }
        return entity;
    }

    private void setup() throws ServiceException {
        if (sessionFactory == null) {
            sessionFactory = new        Configuration().configure().buildSessionFactory();
            logger.debug("Create new SessionFactory={}.", sessionFactory);
        }
    }

最佳答案

我建议您要测试是否记录了特定消息?首先,如果您使用@sl4j,则不必自己实例化记录器。然后应该使用 Lombok 将为您执行此操作(log.debug(..))。您可以通过 LoggerFactory.getLogger(SomeClass.class); 接收测试中的记录器;您可以附加一个模拟的附加程序,并检查所需的日志条目是否已写入您的模拟附加程序。这是一个简单的例子:https://dzone.com/articles/unit-testing-asserting-line

关于java - 如何模拟使用 SLF4J Log4J Logger 的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56915386/

相关文章:

java - 在 Intellij 文件模板中创建用户变量

java - 使用 log4j 为每个应用程序创建单独的日志文件

java - 通过 slf4j 配置 log4j

java - logback:AsyncAppender 比同步 FileAppender 花费更多时间

log4j - gradle NoSuchMethodError:org.apache.log4j.PatternLayout。<init>(Ljava/lang/String;)

maven - 使用 Java 11 运行 Spring Boot 应用程序时出现 java.lang.StackOverflowError

java - 创建新的 SpannableStringBuilder 返回 null

java - 在Java中分割以 "."结尾的段落并在点后换行

java - 在 Java 8 中,可以使 HttpsURLConnection 发送服务器名称指示(SNI)

tomcat - 告诉 Tomcat 使用哪个 log4j.xml