当前位置: 首页 > 知识库问答 >
问题:

使用picocontainer时项目抛出未满足的依赖问题

林波鸿
2023-03-14

在我试图建立的测试中,在实现Cucumber时遇到了一些问题。以此为指导,成功地获得了测试工作Selenium:https://medium . com/@ cbuelvasc/test-automation-in-kotlin-with-Selenium-TestNG-and-page-object-model-e 2252 DBC 492 a

当我尝试在其上添加功能以及步骤定义时 - 它抱怨picocontainer缺少依赖项:

org.picocontainer.injectors.AbstractInjectorpages.LoginPageorg.picocontainer.DefaultPicoContainer@501edcf1中构造函数公共pages.LoginPage(org.openqa.selenium.WebDriver)的接口org.openqa.selenium.WebDriver

这是功能文件:

Feature: Login
  Scenario: A user can log in when they provide valid credentials
    When a valid username is entered in the username field

这个LoginPage类,带有元素定位器和我希望使用的单步定义...

import io.cucumber.java.en.When
import org.openqa.selenium.WebDriver
import org.openqa.selenium.WebElement
import org.openqa.selenium.support.FindBy
import org.openqa.selenium.support.PageFactory

class LoginPage(driver: WebDriver) {
    @FindBy(css = "input.ant-input.input.labeled-input__input.with-input-styles")
    private val emailAddressField: WebElement? = null

    @FindBy(css = "input.ant-input.input.password-input__input.with-input-styles")
    private val passwordField: WebElement? = null

    @FindBy(css = "button.ant-btn.ant-btn-primary.ant-btn-lg.button.button_type_primary.login-form__submit-button")
    private val loginButton: WebElement? = null

    init {
        PageFactory.initElements(driver, this)
    }

    // Input fields
    @When("a valid username is entered in the username field")
    fun addUsername() = emailAddressField?.sendKeys("[value]")


    fun addPassword() = passwordField?.sendKeys("[value]")

    // Buttons
    fun login() = loginButton?.click()
}

这是用于设置的抽象类:

import org.openqa.selenium.WebDriver
import org.openqa.selenium.chrome.ChromeDriver
import org.testng.annotations.AfterTest
import org.testng.annotations.BeforeTest
import util.UtilResources
import java.net.URI
import java.util.concurrent.TimeUnit

abstract class TestBase {
    lateinit var driver: WebDriver
        private set

    @BeforeTest
    fun setup() {
        System.setProperty(
            UtilResources.getProperties("nameDriver"),
            UtilResources.getProperties("pathDriver") + UtilResources.getProperties("exeDriver")
        )
        driver = ChromeDriver()
        driver.manage()?.timeouts()?.implicitlyWait(10, TimeUnit.SECONDS)
        driver.manage()?.window()?.maximize()
        driver.get(URI(UtilResources.getProperties("pageURL")).toString())
    }

    @AfterTest
    fun driverClose() {
        driver.close();
    }
}

pom文件包括依赖项(但每次我尝试包含它-StackOverflow将其标记为垃圾邮件)

完全错误:

Step failed
org.picocontainer.injectors.AbstractInjector$UnsatisfiableDependenciesException: pages.LoginPage has unsatisfied dependency 'interface org.openqa.selenium.WebDriver' for constructor 'public pages.LoginPage(org.openqa.selenium.WebDriver)' from org.picocontainer.DefaultPicoContainer@501edcf1:1<|

想要作为提供的BDD运行测试。使用最初的指南(链接)作为概念验证,用Kotlin编写,并用@Test testng route进行了测试。当试图在顶部添加步骤定义时;获得unsatisfiabledependencies exception,即使所有类都有错误所指的导入。有人能帮忙吗?我错过了一些基本的简单的事情吗?

共有1个答案

湛安宁
2023-03-14

您的登录页面将接口作为构造参数。虽然这通常是DI的正确模式,但Cucumber以简化的方式与PicoContainer集成。

因此,理论上要使您的方法适用于任何DI框架,您必须在某个地方有一个映射,例如“好的DI框架,如果您在某个地方遇到WebDriver的实例,您应该使用这个特定的类实例化该字段或方法参数:ChromeDriver

Cucumber与PicoContainer的集成意味着它只是搜索一个给定的类,如果它是可实例化的,那就没问题。但是由于< code>WebDriver本身不能被实例化,PicoContainer不知道将什么放在那个特定的地方。

PicoContainer的解决方案是创建一个包装类,该类将把对< code>WebDriver方法的调用委托给该接口的底层特定实现。实现是什么可以由一个参数控制(例如)。

注意:该包装器应该以懒惰的方式初始化底层实现并实现Disposable接口,以确保WebDriver的正确终止。

P.S. - 你可以在这里找到更详细的解释,用Java中的例子(可以简单地转换为Kotlin案例)。

 类似资料:
  • 我正在尝试实现一个quarkus-extension用于授权/认证。我使用现有的< code > quar kus-small rye-jwt-abx -扩展作为例子。一切似乎都很好,除了我不能注入< code>Principal: 我得到了 对 java.security.主体和限定符类型未满足的依赖关系 [@Default] 注入

  • 我正在尝试创建一个带有Wildfly和数据库连接的EJB Web项目,以持久化我的类“article”。但当我启动我的应用程序时,我得到了错误 包装服务; ArticleDaoImpl

  • 我有一个属性XML文件,如下所示: 我该怎么解决这个?

  • “我是Spring新手,我刚开始一个Spring MVC CRUD项目,但在尝试了很多方法之后,我一次又一次地面临同样的错误。 这是打印HTTP状态500的第一个异常-内部服务器错误。 HTTP状态500–内部服务器错误 javax。servlet。ServletException:Servlet。servlet[dispatcher]的init()引发异常组织。阿帕奇。卡塔琳娜。验证者。Auth

  • 我觉得我一定忽略了什么。 null Grunt@0.4.2应该匹配所有这些依赖项,但npm说它不匹配,安装失败。我是不是忽略了什么? 根据请求,我的package.json文件: