diff --git a/libpldmresponder/bios_config.cpp b/libpldmresponder/bios_config.cpp
index d5c39ba..90b2ad2 100644
--- a/libpldmresponder/bios_config.cpp
+++ b/libpldmresponder/bios_config.cpp
@@ -1,5 +1,6 @@
 #include "bios_config.hpp"
 
+#include "bios_integer_attribute.hpp"
 #include "bios_string_attribute.hpp"
 
 #include <fstream>
@@ -65,6 +66,9 @@
     load(jsonDir / stringJsonFile, [this](const Json& entry) {
         constructAttribute<BIOSStringAttribute>(entry);
     });
+    load(jsonDir / stringJsonFile, [this](const Json& entry) {
+        constructAttribute<BIOSIntegerAttribute>(entry);
+    });
 }
 
 void BIOSConfig::buildAndStoreAttrTables(const Table& stringTable)
diff --git a/libpldmresponder/bios_integer_attribute.cpp b/libpldmresponder/bios_integer_attribute.cpp
new file mode 100644
index 0000000..90667a2
--- /dev/null
+++ b/libpldmresponder/bios_integer_attribute.cpp
@@ -0,0 +1,177 @@
+#include "bios_integer_attribute.hpp"
+
+#include "utils.hpp"
+
+namespace pldm
+{
+namespace responder
+{
+namespace bios
+{
+
+BIOSIntegerAttribute::BIOSIntegerAttribute(const Json& entry,
+                                           DBusHandler* const dbusHandler) :
+    BIOSAttribute(entry, dbusHandler)
+{
+    std::string attr = entry.at("attribute_name");
+
+    integerInfo.lowerBound = entry.at("lower_bound");
+    integerInfo.upperBound = entry.at("upper_bound");
+    integerInfo.scalarIncrement = entry.at("scalar_increment");
+    integerInfo.defaultValue = entry.at("default_value");
+    pldm_bios_table_attr_entry_integer_info info = {
+        0,
+        readOnly,
+        integerInfo.lowerBound,
+        integerInfo.upperBound,
+        integerInfo.scalarIncrement,
+        integerInfo.defaultValue,
+    };
+    const char* errmsg = nullptr;
+    auto rc = pldm_bios_table_attr_entry_integer_info_check(&info, &errmsg);
+    if (rc != PLDM_SUCCESS)
+    {
+        std::cerr << "Wrong filed for integer attribute, ATTRIBUTE_NAME="
+                  << attr.c_str() << " ERRMSG=" << errmsg
+                  << " LOWER_BOUND=" << integerInfo.lowerBound
+                  << " UPPER_BOUND=" << integerInfo.upperBound
+                  << " DEFAULT_VALUE=" << integerInfo.defaultValue
+                  << " SCALAR_INCREMENT=" << integerInfo.scalarIncrement
+                  << "\n";
+        throw std::invalid_argument("Wrong field for integer attribute");
+    }
+}
+
+void BIOSIntegerAttribute::setAttrValueOnDbus(
+    const pldm_bios_attr_val_table_entry* attrValueEntry,
+    const pldm_bios_attr_table_entry*, const BIOSStringTable&)
+{
+    if (readOnly)
+    {
+        return;
+    }
+    auto currentValue =
+        table::attribute_value::decodeIntegerEntry(attrValueEntry);
+
+    if (dBusMap->propertyType == "uint8_t")
+    {
+        return dbusHandler->setDbusProperty(*dBusMap,
+                                            static_cast<uint8_t>(currentValue));
+    }
+    else if (dBusMap->propertyType == "uint16_t")
+    {
+        return dbusHandler->setDbusProperty(
+            *dBusMap, static_cast<uint16_t>(currentValue));
+    }
+    else if (dBusMap->propertyType == "int16_t")
+    {
+        return dbusHandler->setDbusProperty(*dBusMap,
+                                            static_cast<int16_t>(currentValue));
+    }
+    else if (dBusMap->propertyType == "uint32_t")
+    {
+        return dbusHandler->setDbusProperty(
+            *dBusMap, static_cast<uint32_t>(currentValue));
+    }
+    else if (dBusMap->propertyType == "int32_t")
+    {
+        return dbusHandler->setDbusProperty(*dBusMap,
+                                            static_cast<int32_t>(currentValue));
+    }
+    else if (dBusMap->propertyType == "uint64_t")
+    {
+        return dbusHandler->setDbusProperty(*dBusMap, currentValue);
+    }
+    else if (dBusMap->propertyType == "int64_t")
+    {
+        return dbusHandler->setDbusProperty(*dBusMap,
+                                            static_cast<int64_t>(currentValue));
+    }
+
+    std::cerr << "Unsupported property type on dbus: " << dBusMap->propertyType
+              << std::endl;
+    throw std::invalid_argument("dbus type error");
+}
+
+void BIOSIntegerAttribute::constructEntry(const BIOSStringTable& stringTable,
+                                          Table& attrTable,
+                                          Table& attrValueTable)
+{
+
+    pldm_bios_table_attr_entry_integer_info info = {
+        stringTable.findHandle(name), readOnly,
+        integerInfo.lowerBound,       integerInfo.upperBound,
+        integerInfo.scalarIncrement,  integerInfo.defaultValue,
+    };
+
+    auto attrTableEntry =
+        table::attribute::constructIntegerEntry(attrTable, &info);
+
+    auto [attrHandle, attrType, _] =
+        table::attribute::decodeHeader(attrTableEntry);
+
+    auto currentValue = getAttrValue();
+    table::attribute_value::constructIntegerEntry(attrValueTable, attrHandle,
+                                                  attrType, currentValue);
+}
+
+uint64_t BIOSIntegerAttribute::getAttrValue(PropertyValue propertyValue)
+{
+    uint64_t value;
+    if (dBusMap->propertyType == "uint8_t")
+    {
+        value = std::get<uint8_t>(propertyValue);
+    }
+    else if (dBusMap->propertyType == "uint16_t")
+    {
+        value = std::get<uint16_t>(propertyValue);
+    }
+    else if (dBusMap->propertyType == "int16_t")
+    {
+        value = std::get<int16_t>(propertyValue);
+    }
+    else if (dBusMap->propertyType == "uint32_t")
+    {
+        value = std::get<uint32_t>(propertyValue);
+    }
+    else if (dBusMap->propertyType == "int32_t")
+    {
+        value = std::get<int32_t>(propertyValue);
+    }
+    else if (dBusMap->propertyType == "uint64_t")
+    {
+        value = std::get<uint64_t>(propertyValue);
+    }
+    else if (dBusMap->propertyType == "int64_t")
+    {
+        value = std::get<int64_t>(propertyValue);
+    }
+    return value;
+}
+
+uint64_t BIOSIntegerAttribute::getAttrValue()
+{
+    if (readOnly)
+    {
+        return integerInfo.defaultValue;
+    }
+
+    try
+    {
+        auto propertyValue = dbusHandler->getDbusPropertyVariant(
+            dBusMap->objectPath.c_str(), dBusMap->propertyName.c_str(),
+            dBusMap->interface.c_str());
+
+        return getAttrValue(propertyValue);
+    }
+    catch (const std::exception& e)
+    {
+        std::cerr << "Get Integer Attribute Value Error: AttributeName = "
+                  << name << std::endl;
+        return integerInfo.defaultValue;
+    }
+}
+
+} // namespace bios
+} // namespace responder
+} // namespace pldm
\ No newline at end of file
diff --git a/libpldmresponder/bios_integer_attribute.hpp b/libpldmresponder/bios_integer_attribute.hpp
new file mode 100644
index 0000000..83fa53d
--- /dev/null
+++ b/libpldmresponder/bios_integer_attribute.hpp
@@ -0,0 +1,63 @@
+#pragma once
+
+#include "bios_attribute.hpp"
+
+class TestBIOSIntegerAttribute;
+
+namespace pldm
+{
+namespace responder
+{
+namespace bios
+{
+
+/** @class BIOSIntegerAttribute
+ *  @brief Associate integer entry(attr table and attribute value table) and
+ *         dbus attribute
+ */
+class BIOSIntegerAttribute : public BIOSAttribute
+{
+  public:
+    friend class ::TestBIOSIntegerAttribute;
+
+    /** @brief Construct a bios integer attribute
+     *  @param[in] entry - Json Object
+     *  @param[in] dbusHandler - Dbus Handler
+     */
+    BIOSIntegerAttribute(const Json& entry, DBusHandler* const dbusHandler);
+
+    /** @brief Set Attribute value On Dbus according to the attribute value
+     *         entry
+     *  @param[in] attrValueEntry - The attribute value entry
+     *  @param[in] attrEntry - The attribute entry corresponding to the
+     *                         attribute value entry
+     *  @param[in] stringTable - The string table
+     */
+    void
+        setAttrValueOnDbus(const pldm_bios_attr_val_table_entry* attrValueEntry,
+                           const pldm_bios_attr_table_entry* attrEntry,
+                           const BIOSStringTable& stringTable) override;
+
+    /** @brief Construct corresponding entries at the end of the attribute table
+     *         and attribute value tables
+     *  @param[in] stringTable - The string Table
+     *  @param[in,out] attrTable - The attribute table
+     *  @param[in,out] attrValueTable - The attribute value table
+     */
+    void constructEntry(const BIOSStringTable& stringTable, Table& attrTable,
+                        Table& attrValueTable) override;
+
+  private:
+    /** @brief Integer field from json */
+    table::attribute::IntegerField integerInfo;
+
+    /** @brief Get pldm value from dbus propertyValue */
+    uint64_t getAttrValue(PropertyValue value);
+
+    /** @brief Get value on dbus */
+    uint64_t getAttrValue();
+};
+
+} // namespace bios
+} // namespace responder
+} // namespace pldm
\ No newline at end of file
diff --git a/libpldmresponder/bios_table.cpp b/libpldmresponder/bios_table.cpp
index 4a190f0..67dfb0e 100644
--- a/libpldmresponder/bios_table.cpp
+++ b/libpldmresponder/bios_table.cpp
@@ -155,6 +155,19 @@
                                                          tableSize);
 }
 
+const pldm_bios_attr_table_entry*
+    constructIntegerEntry(Table& table,
+                          pldm_bios_table_attr_entry_integer_info* info)
+{
+    auto entryLength = pldm_bios_table_attr_entry_integer_encode_length();
+    auto tableSize = table.size();
+    table.resize(tableSize + entryLength, 0);
+    pldm_bios_table_attr_entry_integer_encode(table.data() + tableSize,
+                                              entryLength, info);
+    return reinterpret_cast<pldm_bios_attr_table_entry*>(table.data() +
+                                                         tableSize);
+}
+
 StringField decodeStringEntry(const pldm_bios_attr_table_entry* entry)
 {
     auto strType = pldm_bios_table_attr_entry_string_decode_string_type(entry);
@@ -170,6 +183,16 @@
             std::string(buffer.data(), buffer.data() + defLength)};
 }
 
+IntegerField decodeIntegerEntry(const pldm_bios_attr_table_entry* entry)
+{
+    uint64_t lower, upper, def;
+    uint32_t scalar;
+
+    pldm_bios_table_attr_entry_integer_decode(entry, &lower, &upper, &scalar,
+                                              &def);
+    return {lower, upper, scalar, def};
+}
+
 } // namespace attribute
 
 namespace attribute_value
@@ -192,6 +215,11 @@
                        currentString.ptr + currentString.length);
 }
 
+uint64_t decodeIntegerEntry(const pldm_bios_attr_val_table_entry* entry)
+{
+    return pldm_bios_table_attr_value_entry_integer_decode_cv(entry);
+}
+
 const pldm_bios_attr_val_table_entry*
     constructStringEntry(Table& table, uint16_t attrHandle, uint8_t attrType,
                          const std::string& str)
@@ -207,6 +235,22 @@
     return reinterpret_cast<pldm_bios_attr_val_table_entry*>(table.data() +
                                                              tableSize);
 }
+
+const pldm_bios_attr_val_table_entry* constructIntegerEntry(Table& table,
+                                                            uint16_t attrHandle,
+                                                            uint8_t attrType,
+                                                            uint64_t value)
+{
+    auto entryLength = pldm_bios_table_attr_value_entry_encode_integer_length();
+
+    auto tableSize = table.size();
+    table.resize(tableSize + entryLength);
+    pldm_bios_table_attr_value_entry_encode_integer(
+        table.data() + tableSize, entryLength, attrHandle, attrType, value);
+    return reinterpret_cast<pldm_bios_attr_val_table_entry*>(table.data() +
+                                                             tableSize);
+}
+
 std::optional<Table> updateTable(const Table& table, const void* entry,
                                  size_t size)
 {
diff --git a/libpldmresponder/bios_table.hpp b/libpldmresponder/bios_table.hpp
index 4a482db..aab6f53 100644
--- a/libpldmresponder/bios_table.hpp
+++ b/libpldmresponder/bios_table.hpp
@@ -225,6 +225,33 @@
     constructStringEntry(Table& table,
                          pldm_bios_table_attr_entry_string_info* info);
 
+/** @struct IntegerField
+ *  @brief Integer field of attribute table
+ */
+struct IntegerField
+{
+    uint64_t lowerBound;
+    uint64_t upperBound;
+    uint32_t scalarIncrement;
+    uint64_t defaultValue;
+};
+
+/** @brief construct integer entry of attribute table at the end of the
+ *         given table
+ *  @param[in,out] table - The given table
+ *  @param[in] info - integer info
+ *  @return pointer to the constructed entry
+ */
+const pldm_bios_attr_table_entry*
+    constructIntegerEntry(Table& table,
+                          pldm_bios_table_attr_entry_integer_info* info);
+
+/** @brief decode integer entry of attribute table
+ *  @param[in] entry - Pointer to an attribute table entry
+ *  @return Integer field of the entry
+ */
+IntegerField decodeIntegerEntry(const pldm_bios_attr_table_entry* entry);
+
 } // namespace attribute
 
 namespace attribute_value
@@ -251,6 +278,12 @@
  */
 std::string decodeStringEntry(const pldm_bios_attr_val_table_entry* entry);
 
+/** @brief Decode integer entry of attribute value table
+ *  @param[in] entry - Pointer to an attribute value table entry
+ *  @return The decoded integer
+ */
+uint64_t decodeIntegerEntry(const pldm_bios_attr_val_table_entry* entry);
+
 /** @brief Construct string entry of attribute value table at the end of the
  *         given table
  *  @param[in] table - The given table
@@ -263,6 +296,19 @@
     constructStringEntry(Table& table, uint16_t attrHandle, uint8_t attrType,
                          const std::string& str);
 
+/** @brief Construct integer entry of attribute value table at the end of
+ *         the given table
+ *  @param[in] table - The given table
+ *  @param[in] attrHandle - attribute handle
+ *  @param[in] attrType - attribute type
+ *  @param[in] value - The integer
+ *  @return Pointer to the constructed entry
+ */
+const pldm_bios_attr_val_table_entry* constructIntegerEntry(Table& table,
+                                                            uint16_t attrHandle,
+                                                            uint8_t attrType,
+                                                            uint64_t value);
+
 /** @brief construct a table with an new entry
  *  @param[in] table - the table need to be updated
  *  @param[in] entry - the new attribute value entry
diff --git a/libpldmresponder/meson.build b/libpldmresponder/meson.build
index 0a5bfa2..9e073eb 100644
--- a/libpldmresponder/meson.build
+++ b/libpldmresponder/meson.build
@@ -12,6 +12,7 @@
   'bios_parser.cpp',
   'bios_attribute.cpp',
   'bios_string_attribute.cpp',
+  'bios_integer_attribute.cpp',
   'bios_config.cpp',
   'pdr_utils.cpp',
   'pdr.cpp',
diff --git a/test/libpldmresponder_bios_config_test.cpp b/test/libpldmresponder_bios_config_test.cpp
index 2a2b72f..05a3ced 100644
--- a/test/libpldmresponder_bios_config_test.cpp
+++ b/test/libpldmresponder_bios_config_test.cpp
@@ -28,6 +28,7 @@
 
         std::vector<fs::path> paths = {
             "./bios_jsons/string_attrs.json",
+            "./bios_jsons/integer_attrs.json",
         };
 
         for (auto& path : paths)
@@ -148,6 +149,20 @@
                           jsonEntry->at("default_string").get<std::string>());
                 break;
             }
+            case PLDM_BIOS_INTEGER:
+            case PLDM_BIOS_INTEGER_READ_ONLY:
+            {
+                auto integerField = table::attribute::decodeIntegerEntry(entry);
+                EXPECT_EQ(integerField.lowerBound,
+                          jsonEntry->at("lower_bound").get<uint64_t>());
+                EXPECT_EQ(integerField.upperBound,
+                          jsonEntry->at("upper_bound").get<uint64_t>());
+                EXPECT_EQ(integerField.scalarIncrement,
+                          jsonEntry->at("scalar_increment").get<uint32_t>());
+                EXPECT_EQ(integerField.defaultValue,
+                          jsonEntry->at("default_value").get<uint64_t>());
+                break;
+            }
             default:
                 EXPECT_TRUE(false);
                 break;
@@ -175,6 +190,14 @@
                 EXPECT_EQ(value, defValue);
                 break;
             }
+            case PLDM_BIOS_INTEGER:
+            case PLDM_BIOS_INTEGER_READ_ONLY:
+            {
+                auto value = table::attribute_value::decodeIntegerEntry(entry);
+                auto defValue = jsonEntry->at("default_value").get<uint64_t>();
+                EXPECT_EQ(value, defValue);
+                break;
+            }
             default:
                 EXPECT_TRUE(false);
                 break;
diff --git a/test/libpldmresponder_bios_integer_attribute_test.cpp b/test/libpldmresponder_bios_integer_attribute_test.cpp
new file mode 100644
index 0000000..c2c8e36
--- /dev/null
+++ b/test/libpldmresponder_bios_integer_attribute_test.cpp
@@ -0,0 +1,187 @@
+#include "libpldmresponder/bios_integer_attribute.hpp"
+#include "mocked_bios.hpp"
+#include "mocked_utils.hpp"
+
+#include <memory>
+#include <nlohmann/json.hpp>
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+using ::testing::_;
+using ::testing::ElementsAreArray;
+using ::testing::Return;
+using ::testing::StrEq;
+using ::testing::Throw;
+
+class TestBIOSIntegerAttribute : public ::testing::Test
+{
+  public:
+    const auto& getIntegerInfo(const BIOSIntegerAttribute& attribute)
+    {
+        return attribute.integerInfo;
+    }
+};
+
+TEST_F(TestBIOSIntegerAttribute, CtorTest)
+{
+    auto jsonIntegerReadOnly = R"({
+         "attribute_name" : "SBE_IMAGE_MINIMUM_VALID_ECS",
+         "lower_bound" : 1,
+         "upper_bound" : 15,
+         "scalar_increment" : 1,
+         "default_value" : 2
+      })"_json;
+
+    BIOSIntegerAttribute integerReadOnly{jsonIntegerReadOnly, nullptr};
+    EXPECT_EQ(integerReadOnly.name, "SBE_IMAGE_MINIMUM_VALID_ECS");
+    EXPECT_TRUE(integerReadOnly.readOnly);
+    auto& integerInfo = getIntegerInfo(integerReadOnly);
+    EXPECT_EQ(integerInfo.lowerBound, 1);
+    EXPECT_EQ(integerInfo.upperBound, 15);
+    EXPECT_EQ(integerInfo.scalarIncrement, 1);
+    EXPECT_EQ(integerInfo.defaultValue, 2);
+
+    auto jsonIntegerReadOnlyError = R"({
+         "attribute_name" : "SBE_IMAGE_MINIMUM_VALID_ECS",
+         "lower_bound" : 1,
+         "upper_bound" : 15,
+         "scalar_increment" : 1,
+         "default_valu" : 2
+      })"_json; // default_valu -> default_value
+    EXPECT_THROW((BIOSIntegerAttribute{jsonIntegerReadOnlyError, nullptr}),
+                 Json::exception);
+
+    auto jsonIntegerReadWrite = R"({
+         "attribute_name" : "VDD_AVSBUS_RAIL",
+         "lower_bound" : 0,
+         "upper_bound" : 15,
+         "scalar_increment" : 1,
+         "default_value" : 0,
+         "dbus":{
+            "object_path" : "/xyz/openbmc_project/avsbus",
+            "interface" : "xyz.openbmc.AvsBus.Manager",
+            "property_type" : "uint8_t",
+            "property_name" : "Rail"
+         }
+      })"_json;
+
+    BIOSIntegerAttribute integerReadWrite{jsonIntegerReadWrite, nullptr};
+    EXPECT_EQ(integerReadWrite.name, "VDD_AVSBUS_RAIL");
+    EXPECT_TRUE(!integerReadWrite.readOnly);
+}
+
+TEST_F(TestBIOSIntegerAttribute, ConstructEntry)
+{
+    MockBIOSStringTable biosStringTable;
+    MockdBusHandler dbusHandler;
+
+    auto jsonIntegerReadOnly = R"({
+         "attribute_name" : "VDD_AVSBUS_RAIL",
+         "lower_bound" : 1,
+         "upper_bound" : 15,
+         "scalar_increment" : 1,
+         "default_value" : 2
+      })"_json;
+
+    std::vector<uint8_t> expectedAttrEntry{
+        0,    0,                   /* attr handle */
+        0x83,                      /* attr type integer read-only*/
+        5,    0,                   /* attr name handle */
+        1,    0, 0, 0, 0, 0, 0, 0, /* lower bound */
+        15,   0, 0, 0, 0, 0, 0, 0, /* upper bound */
+        1,    0, 0, 0,             /* scalar increment */
+        2,    0, 0, 0, 0, 0, 0, 0, /* defaut value */
+    };
+    std::vector<uint8_t> expectedAttrValueEntry{
+        0,    0,                   /* attr handle */
+        0x83,                      /* attr type integer read-only*/
+        2,    0, 0, 0, 0, 0, 0, 0, /* current value */
+    };
+
+    BIOSIntegerAttribute integerReadOnly{jsonIntegerReadOnly, nullptr};
+
+    ON_CALL(biosStringTable, findHandle(StrEq("VDD_AVSBUS_RAIL")))
+        .WillByDefault(Return(5));
+
+    checkConstructEntry(integerReadOnly, biosStringTable, expectedAttrEntry,
+                        expectedAttrValueEntry);
+
+    auto jsonIntegerReadWrite = R"({
+         "attribute_name" : "VDD_AVSBUS_RAIL",
+         "lower_bound" : 1,
+         "upper_bound" : 15,
+         "scalar_increment" : 1,
+         "default_value" : 2,
+         "dbus":{
+            "object_path" : "/xyz/openbmc_project/avsbus",
+            "interface" : "xyz.openbmc.AvsBus.Manager",
+            "property_type" : "uint8_t",
+            "property_name" : "Rail"
+         }
+      })"_json;
+    BIOSIntegerAttribute integerReadWrite{jsonIntegerReadWrite, &dbusHandler};
+
+    EXPECT_CALL(dbusHandler,
+                getDbusPropertyVariant(StrEq("/xyz/openbmc_project/avsbus"),
+                                       StrEq("Rail"),
+                                       StrEq("xyz.openbmc.AvsBus.Manager")))
+        .WillOnce(Throw(std::exception()));
+
+    /* Set expected attr type to read-write */
+    expectedAttrEntry[2] = PLDM_BIOS_INTEGER;
+    expectedAttrValueEntry[2] = PLDM_BIOS_INTEGER;
+
+    checkConstructEntry(integerReadWrite, biosStringTable, expectedAttrEntry,
+                        expectedAttrValueEntry);
+
+    EXPECT_CALL(dbusHandler,
+                getDbusPropertyVariant(StrEq("/xyz/openbmc_project/avsbus"),
+                                       StrEq("Rail"),
+                                       StrEq("xyz.openbmc.AvsBus.Manager")))
+        .WillOnce(Return(PropertyValue(uint8_t(7))));
+
+    expectedAttrValueEntry = {
+        0, 0,                   /* attr handle */
+        3,                      /* attr type integer read-write*/
+        7, 0, 0, 0, 0, 0, 0, 0, /* current value */
+    };
+
+    checkConstructEntry(integerReadWrite, biosStringTable, expectedAttrEntry,
+                        expectedAttrValueEntry);
+}
+
+TEST_F(TestBIOSIntegerAttribute, setAttrValueOnDbus)
+{
+    MockdBusHandler dbusHandler;
+    MockBIOSStringTable biosStringTable;
+
+    auto jsonIntegerReadWrite = R"({
+         "attribute_name" : "VDD_AVSBUS_RAIL",
+         "lower_bound" : 1,
+         "upper_bound" : 15,
+         "scalar_increment" : 1,
+         "default_value" : 2,
+         "dbus":{
+            "object_path" : "/xyz/openbmc_project/avsbus",
+            "interface" : "xyz.openbmc.AvsBus.Manager",
+            "property_type" : "uint8_t",
+            "property_name" : "Rail"
+         }
+      })"_json;
+    BIOSIntegerAttribute integerReadWrite{jsonIntegerReadWrite, &dbusHandler};
+    DBusMapping dbusMapping{"/xyz/openbmc_project/avsbus",
+                            "xyz.openbmc.AvsBus.Manager", "Rail", "uint8_t"};
+    std::vector<uint8_t> attrValueEntry = {
+        0, 0,                   /* attr handle */
+        3,                      /* attr type integer read-write*/
+        7, 0, 0, 0, 0, 0, 0, 0, /* current value */
+    };
+
+    auto entry = reinterpret_cast<pldm_bios_attr_val_table_entry*>(
+        attrValueEntry.data());
+    EXPECT_CALL(dbusHandler,
+                setDbusProperty(dbusMapping, PropertyValue{uint8_t(7)}))
+        .Times(1);
+    integerReadWrite.setAttrValueOnDbus(entry, nullptr, biosStringTable);
+}
\ No newline at end of file
diff --git a/test/meson.build b/test/meson.build
index 5c03866..0210833 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -22,6 +22,7 @@
   'libpldmresponder_bios_attribute_test',
   'libpldmresponder_bios_string_attribute_test',
   'libpldmresponder_bios_config_test',
+  'libpldmresponder_bios_integer_attribute_test',
   'libpldmresponder_pdr_state_effecter_test',
   'libpldmresponder_bios_table_test',
   'libpldmresponder_platform_test',
